在lock中同步使用Task

1 篇文章 0 订阅

lock中是不允许使用await方法的,在语法上通不过的。
但是如果需要在lock中调用async方法怎么办?需要同步调用async方法
如果不需要返回值,可以用wait()方法 如果需要返回值可以用Result。
例如 有个方法:

public async int Add(int a,int b)
{
await Task.Delay(1000);
return a+b;
}

一、如果在lock中使用的话,先说正确的

var re = Task.Run(()=>Add(1,2)).Result;

Task.Run(()=>Add(1,2)).wait();

解释一下:

  1. wait或result会堵塞当前线程,
  2. 然后从线程池里找个闲着的线程,执行Add方法
  3. 等待Add执行完毕后(或返回了结果),在解开原线程的堵塞

这样原线程就会接着往下走。

二、 错误的

能不能直接用Add(1,2).Result?
不可以的,我认为当方法中有await的时候,直接调用Result(wait)会导致死锁:
程序进入Add方法,当遇到await之前是以同步方法执行的,遇到了await后,会堵塞当前线程,等待await线程结束。
然后await去执行,当await执行完毕后(线程还没有结束),要返回给主线程,却发现主线程在堵塞,
然后导致子线程等待主线程,将结果返回回去;主线程等待子线程结束,好往下进行。
然后就差生了死锁。

三、 那为啥Task.Run(()=>Add(1,2)).Result就可以呢

详细解释一下
Result堵塞了当前主线程
然后执行了Task。Run方法,这个方法从线程池里又找了一个线程,叫子线程,然后子线程运行
然后子线程里面执行了Add方法,当执行到await时,子线程没有被堵塞(被堵塞的是主线程)
然后await 孙线程 去执行,执行完了后,返回给子线程
然后子线程结束,有了返回值
然后主线程解开堵塞

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Lock和synchronized在并发编程都是用来实现线程同步的机制。它们都有各自适用的使用场景。 lock适用于以下场景: 1. 当需要更加灵活的线程同步机制时,可以使用lock。相比于synchronized,lock提供了更多的高级功能,比如可断的等待,可以指定公平或非公平锁,以及尝试获取锁等待一段时间后放弃等待等功能。 2. 当需要在某个代码块获取锁,并在另一个代码块释放锁时,可以使用lock。因为lock需要手动加锁和解锁,所以可以更加灵活地控制锁的获取和释放。 synchronized适用于以下场景: 1. 当只需要简单的线程同步机制时,可以使用synchronized。synchronized是Java语言提供的关键字,使用起来更加简单直观,不需要手动进行加解锁。 2. 当需要对整个方法或代码块进行同步时,可以使用synchronized。synchronized既可以修饰代码块,也可以修饰静态方法和普通方法,非常方便。 总的来说,lock提供了更多的功能和灵活性,适合在复杂的并发场景下使用;而synchronized则更加简单直观,适合在简单的线程同步场景下使用。可以根据具体的需求来选择合适的机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [synchronized和lock的区别以及用法](https://blog.csdn.net/a984171281/article/details/107806758)[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* [Synchronized 和 Lock 的区别和使用场景](https://download.csdn.net/download/weixin_38628953/14884671)[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* [synchronized和lock](https://blog.csdn.net/m0_46123217/article/details/116277548)[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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值