“UseTaskFriendlySynchronizationContext”是什么意思?

2023-12-02

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 中不起作用,当我删除新的应用程序设置时,它又起作用了!

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


关于UseTaskFriendlySynchronizationContext, from 微软论坛:

这告诉 ASP.NET 使用全新的异步管道 遵循启动异步操作的 CLR 约定, 包括在必要时将线程返回到线程池。网络平台 4.0 及以下版本遵循其自己的约定,这违反了 CLR 准则,如果未启用该开关,则very异步方法很容易同步运行、使请求死锁或无法按预期运行。

另外,我认为AsyncOperationManager适用于桌面应用程序。对于 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);
}

目的是通过发布支持以下功能,但目前测试版不支持:

protected async void Button1_Click(object sender, EventArgs e)
{
    var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com");
    Response.Write(res);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“UseTaskFriendlySynchronizationContext”是什么意思? 的相关文章

随机推荐