How should I structure the try/finally when using a SemaphorSlim with cancellation token so that OperationCancelledException is handled correctly? In Option A, cancelling the token source throws OperationCancelledException but does not call Release(). In Option B, cancelling the token source throws OperationCancelledException and DOES call 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();
}
Option A is more correct here. You do not need to
ReleasetheSemaphoreSlimwhen you cancel, as you never actually acquire and increment its count. As such, you don’t want to release unless yourWaitcall actually succeeded.From this MSDN Page on using Semaphore and SemaphoreSlim: