[英]Why use try {} finally {} with an empty try block?
我注意到在System.Threading.TimerBase.Dispose()
該方法有一個try{} finally{}
塊,但try{}
為空。
將try{} finally{}
與空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;
}
來自http://blog.somecreative.com/2008/04/10/the-empty-try-block-mystery/ :
此方法可防止 Thread.Abort 調用中斷處理。 Thread.Abort 的 MSDN 頁面說“未執行的 finally 塊在線程中止之前執行”。 因此,為了保證即使您的線程在中間被某個人在您的線程上調用 Abort 中止,您的處理也能完成,您可以將所有代碼放在 finally 塊中(另一種方法是在“catch”塊中編寫代碼以確定在“嘗試”被 Abort 中斷之前您所在的位置,如果您願意,可以從那里繼續)。
這是為了防止Thread.Abort
中斷進程。 這種方法的文檔說:
未執行的 finally 塊在線程中止之前執行。
這是因為為了從錯誤中成功恢復,您的代碼需要自行清理。 由於 C# 沒有 C++ 樣式的析構函數,因此finally
和using
塊是確保可靠執行此類清理的唯一可靠方法。 請記住,編譯器using
塊變成了這個:
try {
...
}
finally {
if(obj != null)
((IDisposable)obj).Dispose();
}
在 .NET 1.x 中, finally
塊有可能被中止。 此行為已在 .NET 2.0 中更改。
此外,空的try
塊永遠不會被編譯器優化掉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.