Что означает "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"?

Ответ 1

Относительно UseTaskFriendlySynchronizationContext, от Форумы Microsoft:

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

Кроме того, я думаю, что AsyncOperationManager предназначен для настольных приложений. Для приложений ASP.NET вы должны использовать RegisterAsyncTask и установить <%@ Page Async="true", более подробно.

Итак, используя новые ключевые слова С#, ваш пример будет выглядеть следующим образом:

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);
}

Ответ 2

Более подробная информация, приведенная в ASP.NET 4.5.1 документации для appSettings в MSDN:

САШ: UseTaskFriendlySynchronizationContext

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

...

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