Asp.net 什么';“的意思是什么;是否使用TaskFriendlySynchronizationContext;?

Asp.net 什么';“的意思是什么;是否使用TaskFriendlySynchronizationContext;?,asp.net,asynchronous,Asp.net,Asynchronous,asp.net 4.5中有一个新的应用程序设置 <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 但是它在asp.net 4.5中不起作用,当我删除新的应用程序设置时,它又起作用了 那么“UseTaskFriendlySynchronizationContext”的含义是什么呢?关于UseTaskFriendlySynchronizationContext,来自: 这告诉ASP.NET使用

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

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
但是它在asp.net 4.5中不起作用,当我删除新的应用程序设置时,它又起作用了


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

关于
UseTaskFriendlySynchronizationContext
,来自:

这告诉ASP.NET使用一个全新的异步管道 遵循CLR约定启动异步操作, 包括在必要时将线程返回到线程池。ASP.NET 4.0及以下版本遵循其自身的约定,这违反了CLR指南,如果未启用开关,则会禁用 异步方法很容易同步运行,使请求死锁,或以其他方式不按预期运行


另外,我认为
AsyncOperationManager
适用于桌面应用程序。对于ASP.NET应用程序,您应该使用
RegisterAsyncTask
并设置
更多详细信息,引自MSDN上的ASP.NET 4.5.1:

aspnet:UseTaskFriendlySynchronizationContext

指定ASP.NET 4.5中异步代码路径的行为方式

如果此键值设置为false[默认值],则ASP.NET 4.5中的异步代码路径的行为与ASP.NET 4.0中的行为相同。如果这把钥匙 值设置为true时,ASP.NET 4.5将使用经过优化的代码路径 用于任务返回API。正在设置此兼容性开关 启用WebSocket的应用程序必须使用基于任务的 Web表单页面中的异步,以及某些其他异步 行为


我使用了aim代码,效果很好。如何知道它当前不受支持?什么情况不支持?@Dozer,我猜您没有将UseTaskFriendlySynchronizationContext设置为true?我收到一个关于响应不可用的错误(很容易解决,但如果无法更改的控件被编码为访问它,则不会)。如果您通过该链接访问Microsoft论坛,您可以了解我遇到的几个问题,以及Microsoft员工不支持的评论。我得到的印象是,由于一些问题(不知道是什么,但你可以在那个论坛上询问),它还没有自动插入RegisterAsyncTask,如果没有,那么同步运行它将不会带来任何好处。MSDN中的答案是:“在您的特定示例中,在不设置开关的情况下使用async void方法实际上会在页面中引入竞争条件,在实际呈现页面并将其输出发送到客户端之前,无法保证调用DataBind()方法”。但我尝试了它,页面始终在DataBind()之后呈现方法。我在删除后发现一个问题。如果您编写两个方法:异步页面加载,异步按钮1\u单击。当您单击按钮时,这两个方法将并行运行。我认为这种情况是“竞争条件”。
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());
}
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);
}
protected async void Button1_Click(object sender, EventArgs e)
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}