Encontré algunas de las mejores prácticas para la programación asincrónica usando c # 's async
/ await
keywords (soy nuevo en c # 5.0).
Uno de los consejos dados fue el siguiente:
Estabilidad: conozca sus contextos de sincronización
... Algunos contextos de sincronización son no reentrantes y de un solo subproceso. Esto significa que solo se puede ejecutar una unidad de trabajo en el contexto en un momento dado. Un ejemplo de esto es el subproceso de la interfaz de usuario de Windows o el contexto de solicitud ASP.NET. En estos contextos de sincronización de un solo subproceso, es fácil bloquearse. Si genera una tarea desde un contexto de un solo subproceso, luego espera esa tarea en el contexto, su código de espera puede estar bloqueando la tarea en segundo plano.
public ActionResult ActionAsync()
{
// DEADLOCK: this blocks on the async task
var data = GetDataAsync().Result;
return View(data);
}
private async Task<string> GetDataAsync()
{
// a very simple async method
var result = await MyWebService.GetDataAsync();
return result.ToString();
}
Si trato de analizarlo yo mismo, el hilo principal genera uno nuevo en MyWebService.GetDataAsync();
, pero como el hilo principal espera allí, espera el resultado en GetDataAsync().Result
. Mientras tanto, digamos que los datos están listos. ¿Por qué el hilo principal no continúa su lógica de continuación y devuelve un resultado de cadena GetDataAsync()
?
¿Puede alguien explicarme por qué hay un punto muerto en el ejemplo anterior? No tengo ni idea de cuál es el problema ...