即使我使用了 ConfigureAwait(false)
,我仍然陷入死锁,以下是示例代码。
根据示例http://blog.stephencleary.com/2012/02/async-and-await.html(#避免上下文),这不应该导致死锁。
这是我的类:
public class ProjectsRetriever
{
public string GetProjects()
{
...
var projects = this.GetProjects(uri).Result;
...
...
}
private async Task<IEnumerable<Project>> GetProjects(Uri uri)
{
return await this.projectSystem.GetProjects(uri, Constants.UserName).ConfigureAwait(false);
}
}
这个类来自一个共享库:
public class ProjectSystem
{
public async Task<IEnumerable<Project>> GetProjects(Uri uri, string userName)
{
var projectClient = this.GetHttpClient<ProjectHttpClient>(uri);
var projects = await projectClient.GetProjects();
// code here is never hit
...
}
如果在共享库中的 await 调用中添加 ConfigureAwait(false),则会起作用,其中包含 HttpClient 调用:
public class ProjectSystem
{
public async Task<IEnumerable<Project>> GetProjects(Uri uri, string userName)
{
var projectClient = this.GetHttpClient<ProjectHttpClient>(uri);
var projects = await projectClient.GetProjects().ConfigureAwait(false);
// no deadlock, resumes in a new thread.
...
}
我已经查看了所有找到的博客,唯一的区别是在使用httpClient.AsyncApi()调用时使用ConfigureAwait(false)有效果!?
请帮忙澄清!!!
ConfigureAwait(false)
也不起作用”,但是在你的代码中,你又说第二个示例可以工作。那到底是哪一个呢? - Yuval ItzchakovGetProjects
返回的任务上调用ConfigureAwait(false)
之前,已经调用(和等待)了ProjectSystem.GetProjects
。在我看来,最好的答案是“只提供异步API”,即使ProjectsRetriever.GetProjects()
异步化。 - Stephen ClearyGetProjects()
(没有参数的重载)不是async
并且不返回Task
,因此您无法在其上使用await
。这段代码甚至都不合法。 - BlueRaja - Danny Pflughoeft.Result
,而应该使用await
。这个问题毫无意义。 - BlueRaja - Danny Pflughoeft