C# · Intermediário · Inglês · Técnico
sync over async
Antipadrão de bloquear código assíncrono com .Result, .Wait() ou GetAwaiter().GetResult(). Pode causar deadlock em contextos de sincronização e consome threads do pool à toa.
Onde usar
Aparece em code reviews de código legado ou de construtores que precisam de dados assíncronos. A correção é propagar async até o topo, e não 'esconder' a espera com Result.
Em código
// Ruim: pode travar em UI/ASP.NET clássico
var txt = ObterAsync().Result;
// Bom
var ok = await ObterAsync();
Task<string> ObterAsync()
=> Task.FromResult("x");Exemplos
Calling .Result there is sync over async.
Chamar .Result ali é sync over async.
The deadlock came from sync over async in the constructor.
O deadlock veio de sync over async no construtor.
Cuidado
Não confunda com async over sync (envolver código síncrono em Task.Run): é o inverso e também discutível, mas não causa o mesmo deadlock.
Antônimos
async all the way