使用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
使用Nito.AsyncEx实现异步锁相关推荐
- .net core 同步锁/异步锁
Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await. 如果在Lock中使用异步,则会报错 以下就是.net core中,同步锁/异步锁的用法 一.同步锁 pr ...
- AsyncEx - async/await 的辅助库
简介 AsyncEx - async/await 的辅助库 安装 使用Nuget安装Nito.AsyncEx 使用 AsyncLock 构造AsyncLock函数可以采用异步等待队列:传递自定义等待队 ...
- 聊聊分布式锁——Redis和Redisson的方式
聊聊分布式锁--Redis和Redisson的方式 一.什么是分布式锁 分布式~~锁,要这么念,首先得是『分布式』,然后才是『锁』 分布式:这里的分布式指的是分布式系统,涉及到好多技术和理论,包括CA ...
- 异步广度优先搜索算法
为什么要异步? CPU的工艺越来越小,Cannon Lake架构的Intel CPU已经达到10nm技术,因此在面积不变的情况下,核心数可以明显提升.单纯的提升主频将造成发热量大.需要的电压大.功耗大 ...
- 精尽 Redisson 源码分析 —— 可重入分布式锁 ReentrantLock
1. 概述 在 Redisson 中,提供了 8 种分布锁的实现,具体我们可以在 <Redisson 文档 -- 分布式锁和同步器> 中看到.绝大数情况下,我们使用可重入锁(Reentra ...
- 如何在C#中从同步方法调用异步方法?
我有一个public async void Foo()方法,我想从同步方法中调用它. 到目前为止,我从MSDN文档中看到的所有内容都是通过异步方法调用异步方法,但是我的整个程序不是使用异步方法构建的. ...
- .NET 4.5 基类库中的新增功能
1. 简化的异步编程 C#和VB都支持了新的async & await语法以简化异步编程,.Net Framework中也相应增加了相关的函数以辅助.一个比较醒目的变化就是在IO操作中多了许多 ...
- 基于DDD的.NET开发框架 - ABP缓存Caching实现
返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...
- 如何设计真正高性能高并发分布式系统(万字长文)
"世间可称之为天经地义的事情没几样,复杂的互联网架构也是如此,万丈高楼平地起,架构都是演变而来,那么演变的本质是什么?" - 1 - 引子 软件复杂性来源于几个方面:高并发.高性能 ...
最新文章
- javascript开关_JavaScript开关案例简介
- linux挂载与卸载(转)
- 适合python开发的linux版本,Python Linux下安装多个版本
- String与Integer相互转换
- pytorch图像预处理
- caffe学习日记--Lesson2:再看caffe的安装和使用、学习过程
- hdu 1242 Rescue(BFS入门)
- 中兴机顶盒服务器地址大全,中兴机顶盒安装配置
- Structs个人适用知识整理
- Web前端业界氛围极好的群——鬼懿IT
- Markdown 并排显示图片
- TiDB在摩拜单车在线数据业务的应用和实践
- 初识html及工具的使用
- 玛格丽特·米德2019下半年EI会议与人格理论初探
- vs2015+openCV(x64)出现运行时”无法查找或打开 PDB 文件”问题
- os-003-protected-mode
- android web一条龙,Ubuntu JavaWeb类型项目一条龙环境搭建
- 求数组中最长递增子序列的长度
- uoj51 元旦三侠的游戏
- Exceptional C++ Syle 学习笔记
热门文章
- 从零开始React项目架构(四)
- “芯”痛痛在系统与芯片 转型升级是历史趋势
- R 语言 相关入门资料
- 如何评价国内SRC纷纷上线“白帽子协议”?
- Mac Ubuntu ----端口被占用
- 微信支付四大支付模式分别有哪些区别?
- CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!
- DevToys - 开发人员的瑞士军刀
- 打造史上最小尺寸.Net Core单文件应用程序
- C#中HashTable、Dictionary、ConcurrentDictionary区别