“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行为。