Зачем использовать try {} finally {} с пустым блоком try?



я заметила в System.Threading.TimerBase.Dipose() метод имеет try{} finally{} блок а try{} - это пустое.



есть ли какое-либо значение в использовании try{} finally{} С пустой попытки?



http://labs.developerfusion.co.uk/SourceViewer/browse.aspx?assembly=SSCLI&namespace=System.Threading&type=TimerBase



[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;
}
332   2  

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

    Ничего не найдено.