使用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 = 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实现异步锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程Apollo(阿波罗)配置中心在.N
- 下一篇: 汽车之家店铺数据抓取 DotnetSpi