¿Cuál es el significado de “UseTaskFriendlySynchronizationContext”?

Hay una nueva configuración de la aplicación en asp.net 4.5

 

un código como este se puede ejecutar en 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()); } 

Pero no funciona en asp.net 4.5, y cuando elimino la nueva aplicación, ¡funciona de nuevo!

Entonces, ¿cuál es el significado de “UseTaskFriendlySynchronizationContext”?

Con respecto a UseTaskFriendlySynchronizationContext , de los foros de Microsoft :

Eso le dice a ASP.NET que use una canalización asíncrona completamente nueva que sigue las convenciones de CLR para iniciar operaciones asíncronas, incluyendo la devolución de hilos al ThreadPool cuando sea necesario. ASP.NET 4.0 y versiones posteriores siguieron sus propios convenios que iban en contra de las directrices CLR, y si el cambio no está habilitado, es muy fácil que los métodos asíncronos se ejecuten de forma sincrónica, bloqueen la solicitud o no se comporten como se espera.

Además, creo que AsyncOperationManager está destinado a aplicaciones de escritorio. Para las aplicaciones ASP.NET, debe usar RegisterAsyncTask y configurar < %@ Page Async="true" , consulte aquí para obtener más detalles .

Entonces, usando las nuevas palabras clave c # su ejemplo sería:

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

El objective es admitir lo siguiente por lanzamiento, pero actualmente no es compatible con la versión beta:

 protected async void Button1_Click(object sender, EventArgs e) { var res = await new WebClient().DownloadStringTaskAsync("http://www.google.com"); Response.Write(res); } 

Más detalles, citados de la documentación de ASP.NET 4.5.1 para appSettings en MSDN:

aspnet: UseTaskFriendlySynchronizationContext

Especifica cómo se comportan las rutas de código asíncronas en ASP.NET 4.5.

Si este valor de clave se establece en falso [predeterminado], las rutas de código asíncronas en ASP.NET 4.5 se comportan como lo hicieron en ASP.NET 4.0. Si este valor de clave se establece en verdadero, ASP.NET 4.5 usa rutas de código que están optimizadas para API que devuelven tareas. La configuración de este conmutador de compatibilidad es obligatoria para las aplicaciones habilitadas para WebSockets, para usar la asincronía basada en tareas en las páginas de formularios web y para ciertos otros comportamientos asincrónicos.