使用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 = ;
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());
Console.WriteLine("Foo1 start: " + i);
await DoSomethingAsync();
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();
Console.WriteLine("Foo2 end: " + i);
}
} private Task DoSomethingAsync(int j)
{
return Task<string>.Run(() =>
{
Thread.Sleep();
i = j;
});
}
}
运行结果如下:

使用Nito.AsyncEx实现异步锁的更多相关文章
- 使用Nito.AsyncEx实现异步锁(转)
转载地址:http://www.cnblogs.com/1zhk/p/5269279.html Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await. 以下面的 ...
- Nito.AsyncEx 这个库
有一个非常聪明的小伙子 (我高度赞扬) 叫 Stephen Cleary ,他写了一个很棒的 Extension 集,共同参与开发的还有 Stephen Toub (他显然是经验丰富的),所以我充分信 ...
- C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim
异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...
- C# 异步锁【转】
原文:http://www.yalongyang.com/2013/01/c-sharp-await-lock/ 在C#中,普通用锁很简单 object m_lock = new object(); ...
- C# 异步锁
参考网址: https://www.cnblogs.com/Alicia-meng/p/13330640.html 使用SemaphoreSlim 实现 当多个任务或线程并行运行时,难以避免的对某些有 ...
- asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦
以前一直很懒 碰到ashx要用await异步就绕开 用aspx 或者mvc异步控制器 这次公司需要 我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcess ...
- C#异步编程(五)异步的同步构造
异步的同步构造 任何使用了内核模式的线程同步构造,我都不是特别喜欢.因为所有这些基元都会阻塞一个线程的运行.创建线程的代价很大.创建了不用,这于情于理说不通. 创建了reader-writer锁的情况 ...
- C# 并发编程 (异步编程与多线程)
并发:同时做多件事情 多线程:并发的一种形式,它采用多个线程来执行程序. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.并行处理是多线程的一种,而多线程是并发的一种. 异步编程 ...
- zk客户端及锁的使用
1.生成zk客户端对象 private CuratorFramework buildClient() { logger.info("zookeeper registry center ini ...
随机推荐
- nginx rewirte
server { listen 8888; server_name jobPhp; root F:\ck\Porject\quanRelease\quanJob; try_files $uri $ur ...
- Icinga快速安装与配置
Icinga快速安装与配置/* body */body { margin: 20px; padding: 0; font-family: "Lucida Grande", &quo ...
- WebClient异步下载文件
namespace ConsoleAppSyncDownload{ class Program { static void Main(string[] args) { ...
- jQuery自动补全
方法一: jquery-autocomplete配置: <script type="text/javascript" src="/js/jquery-1.4.2.m ...
- LZW压缩算法
转载自http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html 记录此处仅自己供学习之用 lzw解压缩算法: 用单个字符初始化字符 ...
- 禅道Linux一键安装版
禅道Linux一键安装版 Linux一键安装包内置了apache, php, mysql这些应用程序,只需要下载解压缩即可运行禅道.从7.3版本开始,linux一键安装包分为32位和64位两个包,大家 ...
- phpexcel相关函数
1.header [php] header("Content-Type:application/vnd.ms-excel"); header("Content-Dispo ...
- 关于jquery判断对象是否为空
1. jquery对象分为两种,一种是dom对象,dom对象会自带一个length属性,所以这种情况: obj.length == 0 可以判断对象为空 2. jquery也可以自定义对象,如 var ...
- javascript 中break、 continue、函数不能重载
在javascript中,break与continue有着显著的差别. 如果遇到break语句,会终止最内层循环,无论后面还有多少计算. 如果遇到continue,只会终止此次循环,后面的自循环依然执 ...
- Unity(一)介绍与基本使用
一.IOC介绍 IOC(Inversion of Control),中文译为控制反转,又称为“依赖注入”(DI =Dependence Injection) IOC的基本概念是:不创建对象,但是描述创 ...