我在GitHub上偶然发现了一个问题(https://github.com/HTBox/allReady/issues/1313),在那里他们讨论了如何ConfigureAwait(false)在ASP.NET核心中删除代码
呼叫
ConfigureAwait(false)是多余的,什么都不做
我能找到的最好的答案是一个"旁注"(来自Stephen Cleary,https: //stackoverflow.com/a/40220190/2805831 )
ASP.NET Core不再具有"上下文"
那么,ASP.NET Core中ConfigureAwait(false)真的没必要(即使使用完整的.Net Framework)?在某些情况下,它在性能方面是否有任何实际的好处,或者在结果/语义上有所不同?
编辑:如果我将其作为控制台应用程序托管或在IIS中,它在这方面有所不同吗?
即使使用后我也遇到死锁ConfigureAwait(false),下面是示例代码.
根据示例http://blog.stephencleary.com/2012/02/async-and-await.html(#Avoding Context),这不应该是死锁.
这是我的班级:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
该类来自共享库:
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
...
}
Run Code Online (Sandbox Code Playgroud)
如果我在共享库中添加ConfigureAwait(false)以等待调用,则会起作用,其中进行HttpClient调用:
public class ProjectSystem
{
public async Task<IEnumerable<Project>> GetProjects(Uri uri, string userName)
{
var …Run Code Online (Sandbox Code Playgroud)