async await死锁

本文讲解了异步编程中如何避免使用task.wait和task.result导致的死锁问题,并提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在异步操作中有一条重要的原则:如果你使用了await那么就请一直使用,千万别用task.wait和task.result,因为这会导致死锁。

有一个例子:

 1 async Task AsyncMethod()
 2 {
 3   await Task.Delay(TimeSpan.FromSeconds(1));
 4 }
 5 
 6 void DealLock()
 7 {
 8   Task task=AsyncMethod();
 9   task.wait();  
10 }
View Code

在调用DealLock时就会发生死锁。这是因为:
1、SynchronizationContext 上下文每次只能运行一个线程
2、await前会捕捉上下文,在await后会用上面捕捉到的上下文继续执行
3、task.wait()阻塞了这个线程
所以导致死锁。有两种方法解决这问题:
a、在AsyncMethod中使用ConfigureAwait(false),使await忽略该方法的上下文
b、用await语句调用AsyncMethod方法,使DealLock变成一个异步方法

转载于:https://www.cnblogs.com/cocomilk2015/p/6524534.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值