转载地址: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. angular2学习地址

    http://www.hubwiz.com/course/5599d367a164dd0d75929c76/ http://learnangular2.com/inputs/ https://www. ...

  2. ThinkPhp 3.2 自动验证

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 数据验证有两种方式: 静态方式:在模型类里面通过$_validate属性定义验证规则 ...

  3. asp.net MVC4 表单 - CheckBox兴趣爱好

    1.Model层定义属性 public class vmUser { public string userName { get; set; } public string sex { get; set ...

  4. lcok-free简易实现

    lock-free是一种基于原子变量类来构建的非阻塞同步算法. 比较并交换(compare-and-swap) 我们经常会先检查某项东西,然后对其进行修改,如if(X...) {X=...}.这种行为 ...

  5. sql注入的基本防范手段

    基本的sql注入防御手段,概括来讲就是权限控制和关键词过滤. 防御sql注入 ============================================================= ...

  6. EBS中加载FORM使用的JavaBean的JAR包

    1.SSH端,APP用户登录: 2.输入env,确定环境变量名称FORMS_WEB_CONFIG_FILE: 3.定位模板文件:     $AD_TOP/bin/adtmplreport.sh con ...

  7. linux centos 6.5下安装nodejs

    1.将文件下载或拷贝至/usr/local/src目录下,可使用xshell工具上传文件 2.解压缩文件: tar xvf /usr/local/src/node-v6.9.2-linux-x64 3 ...

  8. Linux学习之六--unZip/Zip的安装及使用

    Linux系统没有自带的压缩解压工具:需要我们自己安装:当用到zip或者unzip如果没有安装就会出现unzip: Command Not Found 或 zip: Command Not Found ...

  9. Redis常用操作及客户端工具

    修改redis密码 打开redis.windows.conf,找到requirepass  设置密码重启服务即可 将redis安装为windows服务,批处理如下: redis-server.exe ...

  10. BMP图像差分/比较

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char ...