Что означает "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 ответа:
о
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, для использования на основе задач асинхронность в веб-формах страниц, а для некоторых других асинхронных поведения.