Зачем использовать try {} finally {} с пустым блоком try?
я заметила в System.Threading.TimerBase.Dipose() метод имеет try{} finally{} блок а try{} - это пустое.
есть ли какое-либо значение в использовании try{} finally{} С пустой попытки?
[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;
}
2 ответов:
от http://blog.somecreativity.com/2008/04/10/the-empty-try-block-mystery/:
эта методология защищает от a Нитка.Прервать вызов прерывание вызова обработка. Страница MSDN Нитка.Аборт говорит, что "неисполненных наконец блоки выполняются перед началом поток прерывается". Так что для того, чтобы гарантируйте, что ваша обработка заканчивается, даже если ваш поток прерванный в середине кем-то вызывая Abort в вашем потоке, вы можете место весь код в конце концов блок (альтернативой является запись код в блоке "catch" для определения где вы были до того, как "попробовать" было прервано прерыванием и исходить из там, если вы хотите).
это для защиты от
Thread.Abortпрервав процесс. документация для этого метода говорит, что:неисполненные окончательно блоки выполняются до прерывания потока.
это потому, что для того, чтобы успешно восстановиться от ошибки, ваш код должен будет очистить после себя. Поскольку C# не имеет деструкторов в стиле C++,
finallyиusingблоки являются единственным надежным способом обеспечения того, что такая очистка выполнено надежно. Помните, чтоusingблок превращается в это компилятором:try { ... } finally { if(obj != null) ((IDisposable)obj).Dispose(); }в .NET 1.x, был шанс, что
finallyблок будет прервана. Это поведение было изменено в .NET 2.0.кроме того, пустой
tryблоки никогда не оптимизируются компилятором.
Comments