Dot-Net

SemaphoreSlim.Wait( CancellationToken ) 正確嘗試/最終用於 OperationCancelledException?

  • September 8, 2014

當使用帶有取消令牌的 SemaphorSlim 時,我應該如何建構 try/finally 以便正確處理 OperationCancelledException?在選項 A 中,取消令牌源會引發 OperationCancelledException,但不會呼叫 Release()。在選項 B 中,取消令牌源會引發 OperationCancelledException,並且會呼叫 Release()。

// option A:
_semaphorSlim.Wait( _cancellationTokenSource.Token );
try
{
    // do work here
}
finally
{
    _semaphorSlim.Release();
}


// option B:
try
{
    _semaphorSlim.Wait( _cancellationTokenSource.Token );
    // do work here
}
finally
{
    _semaphorSlim.Release();
}

選項A在這裡更正確。當您取消時,您不需要ReleaseSemaphoreSlim因為您從未實際獲取並增加其計數。Wait因此,除非您的呼叫實際成功,否則您不想釋放。

從這個MSDN 頁面上使用 Semaphore 和 SemaphoreSlim

確保執行緒不會多次釋放信號量是程序員的責任。例如,假設一個信號量的最大計數為 2,並且執行緒 A 和執行緒 B 都進入了該信號量。如果執行緒 B 中的程式錯誤導致它呼叫 Release 兩次,則兩個呼叫都成功。信號量上的計數已滿,當執行緒 A 最終呼叫 Release 時,會拋出 SemaphoreFullException。

引用自:https://stackoverflow.com/questions/6233774