我有一个.net web api 2方法,我试图让我的代码的一部分在单独的线程中执行某些操作,但是在任务上调用.Wait()方法后,它再也不会到达下一行。我一定在俯视某些东西,但似乎找不到。这是问题的非常简单的版本。 Ok()行永远不会被命中。有什么建议吗?
public IHttpActionResult Get() {
var attachTask = AttachNewTasksAsync();
//do something else
attachTask.Wait();
return Ok();
}
public async System.Threading.Tasks.Task AttachNewTasksAsync()
{
await System.Threading.Tasks.Task.Delay(10000);
}
答案 0 :(得分:8)
死锁。您的主线程正在等待attachTask
完成,而attachTask
无法完成,因为它正在等待主线程。
将ConfigureAwait(false)
添加到Task.Delay
或正确执行然后等待attachTask
应该这样写:
public async Task<IHttpActionResult> Get() {
var attachTask = AttachNewTasksAsync();
//do something else
await attachTask;
return Ok();
}
如何确保即使有人同步等待也不会发生死锁?使用ConfigureAwait(false)
。
public async System.Threading.Tasks.Task AttachNewTasksAsync()
{
await System.Threading.Tasks.Task.Delay(10000).ConfigureAwait(false);
}
Stephen Cleary的博客中可能还没有我写的任何东西,所以我将在这里link保留。