- 使用SemaphoreSlimim 实现
- 当多个任务或线程并行运行时,难免会并发访问一些有限的资源。这方面的控制可以考虑使用信号量(System.Threading.Semaphore)表示Windows内核的信号量对象。如果预计等待时间短,可以考虑使用SemaphoreSlim,费用会更小。.通过跟踪进入和离开的任务或线程,NetFrameWork中的信号量来协调资源的访问。信号量需要知道资源的最大数量。当任务进入时,资源计数器将减少1。当计数器为0时,如果任务访问资源,它将被阻塞,直到任务离开。如果需要跨进程或AppDomain同步,可以考虑使用Semaphore。Semaphore是Windows获得的 因此,内核的信号量在整个系统中是有效的。它的主要接口是Release和Waitone,使用方式与SemaphoreSlim一致。
private static readonly SemaphoreSlim _mutex = new SemaphoreSlim(1); static int _value; public async static Task DelayAndIncrementAsync() { await _mutex.WaitAsync(); try { var oldValue = _value; await Task.Delay(TimeSpan.FromSeconds(oldValue)); Console.WriteLine(_value); _value = oldValue + 1; } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { _mutex.Release(); } }