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实现异步锁相关推荐

  1. .net core 同步锁/异步锁

    Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await. 如果在Lock中使用异步,则会报错 以下就是.net core中,同步锁/异步锁的用法 一.同步锁 pr ...

  2. AsyncEx - async/await 的辅助库

    简介 AsyncEx - async/await 的辅助库 安装 使用Nuget安装Nito.AsyncEx 使用 AsyncLock 构造AsyncLock函数可以采用异步等待队列:传递自定义等待队 ...

  3. 聊聊分布式锁——Redis和Redisson的方式

    聊聊分布式锁--Redis和Redisson的方式 一.什么是分布式锁 分布式~~锁,要这么念,首先得是『分布式』,然后才是『锁』 分布式:这里的分布式指的是分布式系统,涉及到好多技术和理论,包括CA ...

  4. 异步广度优先搜索算法

    为什么要异步? CPU的工艺越来越小,Cannon Lake架构的Intel CPU已经达到10nm技术,因此在面积不变的情况下,核心数可以明显提升.单纯的提升主频将造成发热量大.需要的电压大.功耗大 ...

  5. 精尽 Redisson 源码分析 —— 可重入分布式锁 ReentrantLock

    1. 概述 在 Redisson 中,提供了 8 种分布锁的实现,具体我们可以在 <Redisson 文档 -- 分布式锁和同步器> 中看到.绝大数情况下,我们使用可重入锁(Reentra ...

  6. 如何在C#中从同步方法调用异步方法?

    我有一个public async void Foo()方法,我想从同步方法中调用它. 到目前为止,我从MSDN文档中看到的所有内容都是通过异步方法调用异步方法,但是我的整个程序不是使用异步方法构建的. ...

  7. .NET 4.5 基类库中的新增功能

    1. 简化的异步编程 C#和VB都支持了新的async & await语法以简化异步编程,.Net Framework中也相应增加了相关的函数以辅助.一个比较醒目的变化就是在IO操作中多了许多 ...

  8. 基于DDD的.NET开发框架 - ABP缓存Caching实现

    返回ABP系列 ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行 ...

  9. 如何设计真正高性能高并发分布式系统(万字长文)

    "世间可称之为天经地义的事情没几样,复杂的互联网架构也是如此,万丈高楼平地起,架构都是演变而来,那么演变的本质是什么?" - 1 - 引子 软件复杂性来源于几个方面:高并发.高性能 ...

最新文章

  1. javascript开关_JavaScript开关案例简介
  2. linux挂载与卸载(转)
  3. 适合python开发的linux版本,Python Linux下安装多个版本
  4. String与Integer相互转换
  5. pytorch图像预处理
  6. caffe学习日记--Lesson2:再看caffe的安装和使用、学习过程
  7. hdu 1242 Rescue(BFS入门)
  8. 中兴机顶盒服务器地址大全,中兴机顶盒安装配置
  9. Structs个人适用知识整理
  10. Web前端业界氛围极好的群——鬼懿IT
  11. Markdown 并排显示图片
  12. TiDB在摩拜单车在线数据业务的应用和实践
  13. 初识html及工具的使用
  14. 玛格丽特·米德2019下半年EI会议与人格理论初探
  15. vs2015+openCV(x64)出现运行时”无法查找或打开 PDB 文件”问题
  16. os-003-protected-mode
  17. android web一条龙,Ubuntu JavaWeb类型项目一条龙环境搭建
  18. 求数组中最长递增子序列的长度
  19. uoj51 元旦三侠的游戏
  20. Exceptional C++ Syle 学习笔记

热门文章

  1. 从零开始React项目架构(四)
  2. “芯”痛痛在系统与芯片 转型升级是历史趋势
  3. R 语言 相关入门资料
  4. 如何评价国内SRC纷纷上线“白帽子协议”?
  5. Mac Ubuntu ----端口被占用
  6. 微信支付四大支付模式分别有哪些区别?
  7. CondenserDotNet - 使用 Kestrel 和 Consul 的 API 反向代理库!
  8. DevToys - 开发人员的瑞士军刀
  9. 打造史上最小尺寸.Net Core单文件应用程序
  10. C#中HashTable、Dictionary、ConcurrentDictionary区别