转载地址:http://www.cnblogs.com/1zhk/p/5269279.html

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 }

运行结果如下:

使用Nito.AsyncEx实现异步锁(转)的更多相关文章

  1. 使用Nito.AsyncEx实现异步锁

    Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await. 以下面的代码为例,当你在lock内部使用await时,VS会报错提醒. 最简单的解决办法就是使用第三方的 ...

  2. Nito.AsyncEx 这个库

    有一个非常聪明的小伙子 (我高度赞扬) 叫 Stephen Cleary ,他写了一个很棒的 Extension 集,共同参与开发的还有 Stephen Toub (他显然是经验丰富的),所以我充分信 ...

  3. C# 异步锁 await async锁,lock,Monitor,SemaphoreSlim

    异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maxim ...

  4. C# 异步锁【转】

    原文:http://www.yalongyang.com/2013/01/c-sharp-await-lock/ 在C#中,普通用锁很简单 object m_lock = new object(); ...

  5. C# 异步锁

    参考网址: https://www.cnblogs.com/Alicia-meng/p/13330640.html 使用SemaphoreSlim 实现 当多个任务或线程并行运行时,难以避免的对某些有 ...

  6. asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦

    以前一直很懒  碰到ashx要用await异步就绕开  用aspx  或者mvc异步控制器  这次公司需要  我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcess ...

  7. C#异步编程(五)异步的同步构造

    异步的同步构造 任何使用了内核模式的线程同步构造,我都不是特别喜欢.因为所有这些基元都会阻塞一个线程的运行.创建线程的代价很大.创建了不用,这于情于理说不通. 创建了reader-writer锁的情况 ...

  8. C# 并发编程 (异步编程与多线程)

    并发:同时做多件事情 多线程:并发的一种形式,它采用多个线程来执行程序. 并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程.并行处理是多线程的一种,而多线程是并发的一种. 异步编程 ...

  9. zk客户端及锁的使用

    1.生成zk客户端对象 private CuratorFramework buildClient() { logger.info("zookeeper registry center ini ...

随机推荐

  1. Debian8 从本地源安装软件

    假如你从Debian官网下载了三个DVD镜像,那么就可以设置从本地源来安装软件,例如这里我从官网下载了 debian-8.6.0-amd64-DVD-1.iso,debian-8.6.0-amd64- ...

  2. ELKStack-使用消息队列扩展(十)

    ELKStack-使用消息队列扩展 官方文档:https://www.elastic.co/guide/en/logstash/5.x/deploying-and-scaling.html 流程图 流 ...

  3. 163邮箱问题:554 DT:SPM 163 smtp5,D9GowACHO7RNWNdXmXs1Bw--.9035S2

    最近公司需要开发一个自定义邮箱功能,上网查询一下,利用163邮箱发送邮件. 由于163 的反垃圾机制,(坑爹机制.) 一般出现 554有在1)测试中用了test,测试,关键字在主题或者内容里面. 但是 ...

  4. vue2.0---组件

    什么是组件? 组件是vue.js最强大的功能之一.它可以扩展HTML元素,封装可重用的代码.在更高的层次上,组件是自定义的元素,vue的编译器给它添加特殊功能.其实在有些情况下,组件也可以是原生HTM ...

  5. c语言数据结构复习

    1)线性表 //顺序存储下线性表的操作实现 #include <stdio.h> #include <stdlib.h> typedef int ElemType; /*线性表 ...

  6. TCPIP、Http、Socket的协议~ 写得挺形象,赞

    这篇文章写得挺形象,对TCPIP.HTTP.Socket的作用有一个整体层次的理解. 转载文章内容如下: 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.   通过初步的了 ...

  7. 表单元素的submit()方法和onsubmit事件

    1.表单元素中出现了name="submit"的元素 2.elemForm.submit();不会触发表单的onsubmit事件 3.动态创建表单时遇到的问题 表单元素拥有subm ...

  8. bootstrap Table 中给某一特定值设置table选中

    bootstrap Table 中给某一特定值设置table选中 需求: 如图所示:左边地图人员选定,右边表格相应选中. 功能代码: //表格和图标联动 function changeTableSel ...

  9. Redis实战阅读笔记——第一章

    Redis 实战 中文版 的20-21页看的人郁闷死了,最后看英文版才明白意思,哎,我理解能力差成这样了 其中,图 1-12 有错误,草,这个是英文版的错--应该是group:programming

  10. java开发问题总结-4-Maven使用问题汇总

    Non-resolvable parent POM [INFO] Scanning for projects... [ERROR] The build could not read 1 project ...