使用Nito.AsyncEx实现异步锁
异步 实现 使用
2023-09-14 08:57:09 时间
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<Task>(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<Task>(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<string>.Run(() => 52 { 53 Thread.Sleep(2000); 54 i = j; 55 }); 56 } 57 }
运行结果如下:
相关文章
- c++异步:asio的scheduler实现!
- C++异步:asio的coroutine实现!
- js实现多个异步任务的串行和并行执行(add/sum)
- 异步提交表单_js异步提交表单并回调
- 试试使用Spring Event组合@Async注解,轻松实现代码的解耦和异步
- 每日一题之Vue的异步更新实现原理是怎样的?
- 超实用 Demo:使用 FastAPI、Celery、RabbitMQ 和 MongoDB 实现一个异步任务工作流
- POE设计实战_python异步执行
- rabbitmq异步处理_怎么解决js异步方法执行顺序
- MySQL异步删除大表的方法
- 【Tornado】协程队列和异步DNS解析器在Tornado项目里的实战表现已经运用详解
- 每日一题之Vue的异步更新实现原理是怎样的?5
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
- [android] 数据的异步加载和图片保存详解手机开发
- html5 web worker实现异步执行 计数器详解编程语言
- javascript es6 Promise 异步同步的写法(史上最简单的教程了)详解编程语言
- Oracle AQ:实现异步通信的解决方案(oracleaq)
- Linux下异步IO加速之旅(linux异步io开启)
- Linux AIO:实现异步I/O的有效途径(linuxaio实现)
- Linux异步I/O技术实现实时运算(linux异步读写)
- 异步消息驱动下的Redis实现(异步消息redis)
- 使用Celery和MySQL实现异步任务自动化(celery mysql)
- 如何在MySQL中实现对指定表的异步同步(Mysql不同步指定表)
- 使用Redis阻塞轮询实现异步消息通信的比较(redis阻塞轮询比较)
- 异步任务使用 Redis 队列实现完美的异步任务(redis 队列实现)
- Redis队列发布订阅实现异步消息通信(redis 队列发布订阅)
- 架提高效率Redis配置异步框架实现自动化(redis配置异步框)
- JavaScript异步调用框架(Part5-链式实现)
- 利用jQuery实现GridView异步排序、分页的代码
- js实现图片预加载(js操作Image对象属性complete,事件onload异步加载图片)
- android开发教程之handle实现多线程和异步处理
- php异步调用方法实现示例
- JQuery异步加载无限下拉框级联功能实现示例
- AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
- winform基于异步委托实现多线程摇奖器