async await死锁

  在异步操作中有一条重要的原则:如果你使用了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变成一个异步方法

posted @ 2017-03-09 10:47  cocomilk  阅读(323)  评论(0编辑  收藏  举报