Aguarde vs Task.Wait – Deadlock?

Eu não entendo muito bem a diferença entre Task.Wait e await .

Eu tenho algo semelhante às seguintes funções em um serviço WebAPI do ASP.NET:

 public class TestController : ApiController { public static async Task Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task Bar() { return await Foo(); } public async static Task Ros() { return await Bar(); } // GET api/test public IEnumerable Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x => Ros()).ToArray()); return new string[] { "value1", "value2" }; // This will never execute } } 

Onde Get será impasse.

O que poderia causar isso? Por que isso não causa um problema quando uso uma espera de bloqueio em vez de await Task.Delay ?

Wait e await – enquanto similar conceitualmente – são completamente diferentes.

Wait irá bloquear de forma síncrona até que a tarefa seja concluída. Portanto, o segmento atual está literalmente bloqueado aguardando a conclusão da tarefa. Como regra geral, você deve usar ” async all the down”; isto é, não bloqueie o código async . No meu blog, eu entro nos detalhes de como o bloqueio no código asynchronous causa um impasse .

await assincronamente até que a tarefa seja concluída. Isso significa que o método atual é “pausado” (seu estado é capturado) e o método retorna uma tarefa incompleta ao responsável pela chamada. Mais tarde, quando a expressão await concluída, o restante do método será agendado como uma continuação.

Você também mencionou um “bloco cooperativo”, pelo qual eu suponho que você quer dizer que uma tarefa que você está esperando pode executar no thread em espera. Existem situações em que isso pode acontecer, mas é uma otimização. Existem muitas situações em que isso não pode acontecer, como se a tarefa fosse para outro planejador, ou se já estivesse iniciada ou se fosse uma tarefa não-código (como em seu exemplo de código: Wait não pode executar a tarefa Delay inline porque há nenhum código para isso).

Você pode achar útil minha introdução async / await .