簡體   English   中英

為什么要使用帶有空的 try 塊的 try {} finally {}?

[英]Why use try {} finally {} with an empty try block?

我注意到在System.Threading.TimerBase.Dispose()該方法有一個try{} finally{}塊,但try{}為空。

try{} finally{}與空try一起使用是否有任何價值?

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;
}

來自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++ 樣式的析構函數,因此finallyusing塊是確保可靠執行此類清理的唯一可靠方法。 請記住,編譯器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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM