博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Nito.AsyncEx实现异步锁
阅读量:5828 次
发布时间:2019-06-18

本文共 1997 字,大约阅读时间需要 6 分钟。

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

以下面的代码为例,当你在lock内部使用await时,VS会报错提醒。

最简单的解决办法就是使用第三方的库Nito.AsyncEx。可以通过Nuget安装。

通过AsyncLock就可以在锁的内部实现异步操作了。

样例代码如下:

1 public class AsyncLockDemo 2     { 3         //private readonly object _mutex = new object(); 4         private readonly AsyncLock _mutex = new AsyncLock(); 5         private int i = 0; 6         public void Execute() 7         { 8             Console.WriteLine("before call foo1: "+ i); 9 10             Foo1().ContinueWith(new Action
(t =>11 {12 Console.WriteLine("foo1 completed: " + i);13 }));14 15 Console.WriteLine("after call foo1: " + i);16 17 Console.WriteLine("before call foo2: " + i);18 19 Foo2().ContinueWith(new Action
(t =>20 {21 Console.WriteLine("foo2 completed: " + i);22 }));23 24 Console.WriteLine("after call foo2: " + i);25 }26 27 public async Task Foo1()28 {29 using (await _mutex.LockAsync())30 {31 await Task.Delay(TimeSpan.FromSeconds(1));32 Console.WriteLine("Foo1 start: " + i);33 await DoSomethingAsync(1);34 Console.WriteLine("Foo1 end: " + i);35 }36 }37 38 public async Task Foo2()39 {40 using (await _mutex.LockAsync())41 {42 Console.WriteLine("Foo2 start: " + i);43 //await Task.Delay(TimeSpan.FromSeconds(1));44 await DoSomethingAsync(2);45 Console.WriteLine("Foo2 end: " + i);46 }47 }48 49 private Task DoSomethingAsync(int j)50 {51 return Task
.Run(() =>52 {53 Thread.Sleep(2000);54 i = j;55 });56 }57 }

运行结果如下:

 

转载于:https://www.cnblogs.com/1zhk/p/5269279.html

你可能感兴趣的文章
win8 关闭防火墙
查看>>
CSS——(2)与标准流盒模型
查看>>
C#中的Marshal
查看>>
linux命令:ls
查看>>
Using RequireJS in AngularJS Applications
查看>>
hdu 2444(二分图最大匹配)
查看>>
【SAP HANA】关于SAP HANA中带层次结构的计算视图Cacultation View创建、激活状况下在系统中生成对象的研究...
查看>>
DevOps 前世今生 | mPaaS 线上直播 CodeHub #1 回顾
查看>>
iOS 解决UITabelView刷新闪动
查看>>
CentOS 7 装vim遇到的问题和解决方法
查看>>
JavaScript基础教程1-20160612
查看>>
【ros】Create a ROS package:package dependencies报错
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
Linux基础命令---rmdir
查看>>
Squid 反向代理服务器配置
查看>>
Java I/O操作
查看>>
Tomcat性能调优
查看>>