使用Nito.AsyncEx实现异步锁

Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await.

以下面的代码为例,当你在lock内部使用await时,VS会报错提醒。
在这里插入图片描述

最简单的解决办法就是使用第三方的库Nito.AsyncEx。可以通过Nuget安装。
在这里插入图片描述
通过AsyncLock就可以在锁的内部实现异步操作了。

样例代码如下:

public class AsyncLockDemo
    {
        //private readonly object _mutex = new object();
        private readonly AsyncLock _mutex = new AsyncLock();
        private int i = 0;
        public void Execute()
        {
            Console.WriteLine("before call foo1: "+ i);

            Foo1().ContinueWith(new Action<Task>(t =>
            {
                Console.WriteLine("foo1 completed: " + i);
            }));

            Console.WriteLine("after call foo1: " + i);

            Console.WriteLine("before call foo2: " + i);

            Foo2().ContinueWith(new Action<Task>(t =>
            {
                Console.WriteLine("foo2 completed: " + i);
            }));

            Console.WriteLine("after call foo2: " + i);
        }

        public async Task Foo1()
        {
            using (await _mutex.LockAsync())
            {
                await Task.Delay(TimeSpan.FromSeconds(1));
                Console.WriteLine("Foo1 start: " + i);
                await DoSomethingAsync(1);
                Console.WriteLine("Foo1 end: " + i);
            }
        }

        public async Task Foo2()
        {
            using (await _mutex.LockAsync())
            {
                Console.WriteLine("Foo2 start: " + i);
                //await Task.Delay(TimeSpan.FromSeconds(1));
                await DoSomethingAsync(2);
                Console.WriteLine("Foo2 end: " + i);
            }
        }

        private Task DoSomethingAsync(int j)
        {
            return Task<string>.Run(() =>
            {
                Thread.Sleep(2000);
                i = j;
            });
        }
    }

运行结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值