我正在使用ConfigureAwait(false)调用异步库方法.但是,我仍然陷入僵局.(我在ASP.NET控制器API中使用它)但是,如果我使用包装到Task.Run()中的相同方法,它工作正常.
我的理解是,如果库方法没有在内部使用ConfigureAwait,那么添加ConfigureAwait将无法解决问题,因为在库调用中它将导致死锁(我们使用.Result阻止它).但是,如果是这样的话,为什么它在Task.Run()中工作,因为它将无法在相同的上下文/线程中继续.
此文章谈论它.顺便说一句,我已经准备好斯蒂芬克莱里的很多文章了.但是,为什么Task.Run()工作是一个谜.
代码段:
// This Create Method results in Deadlock
public async Task<string> Create(MyConfig config)
{
Document doc = await Client.CreateDocumentAsync(CollectionUri, config).ConfigureAwait(false);
return doc.Id;
}
// Uses Task.Run() which works properly, why??
public string Create(MyConfig config)
{
Document doc = Task.Run(() => Client.CreateDocumentAsync(CollectionUri, config)).Result;
return doc.Id;
}
[HttpPost]
public ActionResult CreateConfig(MyConfig config)
{
string id = Create(config).Result;
return Json(id);
}
Run Code Online (Sandbox Code Playgroud)