C# 异步锁

  • 使用SemaphoreSlim 实现
    • 当多个任务或线程并行运行时,难以避免的对某些有限的资源进行并发的访问。可以考虑使用信号量来进行这方面的控制(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();
            }
        }

posted @ 2020-07-17 16:05  C余L小R鱼  阅读(1540)  评论(0编辑  收藏  举报