Mir ist aufgefallen, dass System.Threading.TimerBase.Dispose()
die Methode einen try{} finally{}
Block hat, der try{}
aber leer ist.
Gibt es einen Wert bei der Verwendung try{} finally{}
mit einem leeren try
?
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
internal bool Dispose(WaitHandle notifyObject)
{
bool status = false;
bool bLockTaken = false;
RuntimeHelpers.PrepareConstrainedRegions();
try {
}
finally {
do {
if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0) {
bLockTaken = true;
try {
status = DeleteTimerNative(notifyObject.SafeWaitHandle);
}
finally {
m_lock = 0;
}
}
Thread.SpinWait(1);
// yield to processor
}
while (!bLockTaken);
GC.SuppressFinalize(this);
}
return status;
}
Antworten:
Von http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/ :
quelle
Thread.BeginCriticalRegion()
nicht verhindert wird, dass ein Thread abgebrochen wird, sondern der Laufzeit mitgeteilt wird, dass der globale Status beschädigt ist , wenn ein Thread abgebrochen wird, und die gesamte Appdomain einem Gnadenmord ausgesetzt ist.BeginCriticalSection()
wirklich nicht in .NET 1.x vorhanden, aber es gibt keine Ursache und Wirkung, die Sie implizieren, wenn Sie sagen, weil . In .NET 1.x könnte sogar einfinally
Block durch einen Thread-Abbruch unterbrochen worden sein. Diese Mechanismen dienen einem anderen Zweck: Durch Arbeiten in a wird einfinally
Abbruch auf halbem Weg im Code verhindert, währendBeginCriticalSection()
nur zur Laufzeit erklärt wird, dass der globale Status gefährdet ist.Dies soll verhindern, dass
Thread.Abort
ein Prozess unterbrochen wird. Die Dokumentation für diese Methode besagt Folgendes:Dies liegt daran, dass Ihr Code nach sich selbst bereinigt werden muss, um einen Fehler erfolgreich zu beheben. Da C # keine Destruktoren im C ++ - Stil hat
finally
undusing
Blöcke die einzige zuverlässige Möglichkeit sind, um sicherzustellen, dass eine solche Bereinigung zuverlässig durchgeführt wird. Denken Sie daran, dassusing
der Compiler diesen Block in diesen verwandelt:In .NET 1.x bestand die Möglichkeit, dass der
finally
Block abgebrochen wird. Dieses Verhalten wurde in .NET 2.0 geändert.Darüber hinaus werden leere
try
Blöcke vom Compiler niemals optimiert.quelle
Dispose(false);
. docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…