ExpertiDict

C# · Intermediário · Inglês · Técnico

sync over async

/sɪŋk ˈoʊvɚ əˈsɪŋk/substantivo

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

Veja também

Todos os termos de C#