c#锁定并听取CancellationToken

Kar*_*ten 8 c# multithreading .net-4.0 task-parallel-library cancellation-token

我想使用锁或类似的同步来保护关键部分.同时我想听一个CancellationToken.

现在我正在使用这样的互斥锁,但是互斥锁没有那么好的性能.我可以使用任何其他同步类(包括新的.Net 4.0)而不是互斥锁吗?

WaitHandle.WaitAny(new[] { CancelToken.WaitHandle, _mutex});
CancelToken.ThrowIfCancellationRequested();
Run Code Online (Sandbox Code Playgroud)

sll*_*sll 12

看看SemaphoreSlim Class的新.NET 4.0 Framework功能.它提供了SemaphoreSlim.Wait(CancellationToken)方法.

阻止当前线程,直到它可以进入SemaphoreSlim,同时观察CancellationToken

从某些角度来看,在这种简单的情况下使用Semaphore可能是一种开销,因为最初它的设计目的是为多个线程提供访问权限,但也许您可能会发现它很有用.

编辑:代码片段

CancellationToken token = new CancellationToken();            
SemaphoreSlim semaphore = new SemaphoreSlim(1,1);

try {
   // block section entrance for other threads
   semaphore.Wait(token);

   // critical section code
   // ...
   if (token.IsCancellationRequested)
   {
       // ...
   }
}
finally { 
   semaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)

  • @sll ...不,你应该这样做,以确保无论如何释放信号量 (3认同)