J'ai remarqué que System.Threading.TimerBase.Dispose()
la méthode a un try{} finally{}
bloc mais le try{}
est vide.
Y a-t-il une valeur à utiliser try{} finally{}
avec un vide 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;
}
Réponses:
Sur http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/ :
la source
Thread.BeginCriticalRegion()
ne pas empêcher un fil d'être avorté, dit plutôt le moteur d' exécution que si un thread est interrompu, alors état global est corrompu, et l'ensemble est appdomain jusqu'à un meurtre par compassion.BeginCriticalSection()
n'était vraiment pas là dans .NET 1.x, mais il n'y a pas de cause à effet que vous impliquez en disant parce que . En fait, dans .NET 1.x, même unfinally
bloc aurait pu être interrompu par un abandon de thread. Ces mécanismes ont un objectif différent: effectuer un travail dans afinally
empêche l'abandon à mi-chemin dans le code, tout enBeginCriticalSection()
déclarant uniquement à l'exécution que l'état global est menacé.Il s'agit de se prémunir contre l'
Thread.Abort
interruption d'un processus. La documentation de cette méthode indique que:En effet, afin de récupérer avec succès après une erreur, votre code devra être nettoyé après lui-même. Étant donné que C # n'a pas de destructeurs de style C ++,
finally
et lesusing
blocs sont le seul moyen fiable de garantir que ce nettoyage est effectué de manière fiable. N'oubliez pas que leusing
bloc se transforme en ceci par le compilateur:Dans .NET 1.x, il était possible que le
finally
bloc soit abandonné. Ce comportement a été modifié dans .NET 2.0.De plus, les
try
blocs vides ne sont jamais optimisés par le compilateur.la source
Dispose(false);
. docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…