java 同步锁 异步锁_使用Nito.AsyncEx实现异步锁

原标题:使用Nito.AsyncEx实现异步锁

Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await.

以下面的代码为例,当你在lock内部使用await时,VS会报错提醒。

478f5e0d6b52b74b44db64c7d3fea5ff.png

最简单的解决办法就是使用第三方的库Nito.AsyncEx。可以通过Nuget安装。

0f677a695139bdf9d51c8432940824cc.png

通过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(t =>

{

Console.WriteLine("foo1 completed: " + i);

}));

Console.WriteLine("after call foo1: " + i);

Console.WriteLine("before call foo2: " + i);

Foo2().ContinueWith(new Action(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.Run(() =>

{

Thread.Sleep(2000);

i = j;

});

}

}

运行结果如下:

472cbfb1baa2f5e1dc600e80b786d254.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
只会clone的程序员是指那些只会通过复制和粘贴别人的代码来完成任务,缺乏对代码背后逻辑和原理的理解以及解决问题的能力。这种程序员主要依赖于他人的代码来完成任务,而没有真正的技术能力和创造力。他们可能能够完成一些简单的任务,但在面对复杂的问题时,他们可能会感到无所适从。只会clone的程序员通常缺乏对算法和数据结构的理解,无法做到对代码的优化和改进。因此,只会clone的程序员往往无法在实际工作中取得长期的成功。对于想要成为一名优秀的程序员的人来说,只会clone是远远不够的,他们需要不断学习和提升自己的技能,深入理解编程语言和计算机科学的基本原理。引用提到了关系编程和函数式编程的结合,这可以帮助程序员开发出更高质量和可维护的代码。引用提到了React应用程序的创建和开发,这是现代Web开发中非常流行的框架。引用讨论了一个旨在数字化考试过程的项目,这展示了程序员需要不断掌握新技术和适应新环境的能力。因此,充分理解和掌握编程原理和技能,以及不断学习和更新自己的知识是成为一名优秀程序员的必要条件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [只刷题能做程序员吗-logic-tutorial:关系编程的一个非常温和的介绍](https://download.csdn.net/download/weixin_38688969/19955562)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [whatsapp-clone:聪明程序员的教程](https://download.csdn.net/download/weixin_42164702/19101448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [程序员考试刷题-nito-clone:它的克隆](https://download.csdn.net/download/weixin_38701683/20057329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值