当前位置: 首页 > 图灵资讯 > 技术篇> C# 异步锁

C# 异步锁

来源:图灵教育
时间:2023-06-06 09:26:23

  • 使用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();            }        }