“UseTaskFriendlySynchronizationContext”的含义是什么?

在asp.net 4.5中有一个新的应用程序设置

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 

这样的代码可以在asp.net 4.0中运行

 protected void Button1_Click(object sender, EventArgs e) { CallAysnc(); } public void CallAysnc() { AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString()); WebClient client = new WebClient(); client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) => { asyncOp.PostOperationCompleted(CallCompleted, e.Result); }; client.DownloadStringAsync(new Uri("http://www.google.com")); } private void CallCompleted(object args) { Response.Write(args.ToString()); } 

但它不能在asp.net 4.5,当我删除新的appsetting,它再次工作!

那么“UseTaskFriendlySynchronizationContext”的含义是什么?

关于Microsoft的 UseTaskFriendlySynchronizationContext 论坛 :

这就告诉ASP.NET使用全新的asynchronouspipe道,它遵循CLR约定来启动asynchronous操作,包括在必要时将线程返回到ThreadPool。 ASP.NET 4.0及其以下版本遵循自己的约定,违背了CLR原则,如果交换机未启用,则asynchronous方法非常容易同步运行,死锁请求或以其他方式不按预期运行。

另外,我认为AsyncOperationManager是为桌面应用程序而devise的。 对于ASP.NET应用程序,您应该使用RegisterAsyncTask并设置<%@ Page Async="true" , 请参阅此处获取更多详细信息 。

所以使用新的c#关键字你的例子将是:

 protected void Button1_Click(object sender, EventArgs e) { RegisterAsyncTask(new PageAsyncTask(CallAysnc)); } private async Task CallAysnc() { var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com"); Response.Write(res); } 

目标是通过发行版来支持以下内容,但目前尚不支持该testing版:

 protected async void Button1_Click(object sender, EventArgs e) { var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com"); Response.Write(res); } 

更多细节,从MSDN上的ASP.NET 4.5.1 文档中引用appSettings :

ASPNET:UseTaskFriendlySynchronizationContext

指定ASP.NET 4.5中的asynchronous代码path的行为。

如果此键值设置为false [默认值],则ASP.NET 4.5中的asynchronous代码path的行为与在ASP.NET 4.0中的行为相同。 如果此键值设置为true,则ASP.NET 4.5会使用针对任务返回API进行优化的代码path。 为支持WebSocket的应用程序设置此兼容性开关,在Web窗体页中使用基于任务的asynchronous和某些其他asynchronous行为。