zoukankan      html  css  js  c++  java
  • 使用Nito.AsyncEx实现异步锁(转)

    转载地址: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     }
    复制代码

    运行结果如下:

  • 相关阅读:
    canvas 平移&缩放
    html + css + jquery实现简单的进度条实例
    jQuery Layer mobile 弹出层
    jQuery-全屏滚动插件【fullPage.js】API 使用方法总结
    Hive:select count(distinct)优化以及hive.groupby.skewindata
    Spark Application、Driver、Job、stage、task
    Spark 参数说明
    Xgboost小结与调参
    梯度下降算法过程详细解读
    机器学习杂记
  • 原文地址:https://www.cnblogs.com/yxlblogs/p/5922795.html
Copyright © 2011-2022 走看看