Что означает "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,и когда я удаляю новый набор приложений, он снова работает!

Так что же означает "UseTaskFriendlySynchronizationContext"?

2 60

2 ответа:

о UseTaskFriendlySynchronizationContext С Форумы Microsoft:

это говорит ASP.NET чтобы использовать совершенно новый асинхронный конвейер, который следует соглашениям среды CLR для запуска асинхронных операций, включая возврат потоков в пул потоков, когда это необходимо. ASP.NET 4.0 и ниже следовали своим собственным соглашениям, которые шли вразрез с рекомендациями CLR, и если коммутатор не включен, это очень легко для асинхронных методов для запуска синхронно, блокировать запрос, или иначе не вести себя так, как ожидалось.

кроме того, я думаю 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);
}

Подробнее, цитируется ASP.NET 4.5.1 документация для appSettings на MSDN:

aspnet: UseTaskFriendlySynchronizationContext

указывает, как асинхронные пути кода в ASP.NET 4.5 ведите себя прилично.

...

Если это значение ключа имеет значение false [по умолчанию], асинхронные пути кода в ASP.NET 4.5 вести себя так, как они делали в ASP.NET 4.0. Если этот ключ значение равно true, ASP.NET 4.5 использует код пути, которые оптимизированы для API-интерфейсов, возвращающих задачи. Настройка этого параметра совместимости обязательно для приложений с поддержкой WebSockets, для использования на основе задач асинхронность в веб-формах страниц, а для некоторых других асинхронных поведения.