使用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;

            });

        }

    }

运行结果如下:

原文地址: http://www.cnblogs.com/1zhk/p/5269279.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值