Me deparei com algumas práticas recomendadas para programação assíncrona usando c # 's async
/ await
keywords (eu sou novo no c # 5.0).
Um dos conselhos dados foi o seguinte:
Estabilidade: Conheça seus contextos de sincronização
... Alguns contextos de sincronização são não reentrantes e de thread único. Isso significa que apenas uma unidade de trabalho pode ser executada no contexto em um determinado momento. Um exemplo disso é o thread da IU do Windows ou o contexto de solicitação ASP.NET. Nesses contextos de sincronização de thread único, é fácil travar você mesmo. Se você gerar uma tarefa de um contexto de thread único e esperar por essa tarefa no contexto, seu código de espera pode estar bloqueando a tarefa em 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();
}
Se eu tentar dissecá-lo sozinho, o thread principal gerará um novo em MyWebService.GetDataAsync();
, mas, como o thread principal aguarda lá, ele espera o resultado em GetDataAsync().Result
. Enquanto isso, digamos que os dados estejam prontos. Por que o thread principal não continua sua lógica de continuação e retorna um resultado de string GetDataAsync()
?
Alguém pode me explicar por que há um impasse no exemplo acima? Estou completamente sem noção sobre qual é o problema ...