Esta pergunta diz respeito à linguagem C #, mas espero que abranja outras linguagens como Java ou TypeScript.
A Microsoft recomenda práticas recomendadas sobre o uso de chamadas assíncronas no .NET. Entre essas recomendações, vamos escolher duas:
- altere a assinatura dos métodos assíncronos para que eles retornem Tarefa ou Tarefa <> (no TypeScript, isso seria uma promessa <>)
- altere os nomes dos métodos assíncronos para terminar com xxxAsync ()
Agora, ao substituir um componente síncrono de baixo nível por um componente assíncrono, isso afeta toda a pilha do aplicativo. Como o assíncrono / espera tem um impacto positivo apenas se usado "até o fim", significa que os nomes de assinatura e método de cada camada no aplicativo devem ser alterados.
Uma boa arquitetura geralmente envolve a colocação de abstrações entre cada camada, de forma que a substituição de componentes de baixo nível por outras não seja vista pelos componentes de nível superior. Em C #, as abstrações assumem a forma de interfaces. Se introduzirmos um novo componente assíncrono de baixo nível, cada interface na pilha de chamadas precisará ser modificada ou substituída por uma nova interface. A maneira como um problema é resolvido (assíncrono ou sincronizado) em uma classe de implementação não está mais oculto (abstraído) para os chamadores. Os chamadores precisam saber se é sincronizado ou assíncrono.
As melhores práticas assíncronas / aguardam não estão em contradição com os princípios da "boa arquitetura"?
Isso significa que cada interface (por exemplo, IEnumerable, IDataAccessLayer) precisa de sua contrapartida assíncrona (IAsyncEnumerable, IAsyncDataAccessLayer), para que possam ser substituídas na pilha ao alternar para dependências assíncronas?
Se formos um pouco mais longe, não seria mais simples supor que todos os métodos sejam assíncronos (retornar uma tarefa <> ou Promessa <>) e que os métodos sincronizem as chamadas assíncronas quando elas não são realmente assíncrono? Isso é algo que se espera das futuras linguagens de programação?
CancellationToken
usar a e aqueles que o fazem podem desejar fornecer um padrão). A remoção dos métodos de sincronização existentes (e a quebra proativa de todo o código) é óbvia para iniciantes.