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