Depois de lidar com o padrão assíncrono / aguardado do C # por um tempo, de repente percebi que não sabia realmente como explicar o que acontece no código a seguir:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
é assumido como retornando um aguardável Task
que pode ou não causar uma troca de encadeamento quando a continuação é executada.
Eu não ficaria confuso se a espera não estivesse dentro de um loop. Eu naturalmente esperaria que o restante do método (ou seja, continuação) fosse executado em outro segmento, o que é bom.
No entanto, dentro de um loop, o conceito de "o resto do método" fica um pouco nebuloso para mim.
O que acontece com "o resto do loop" se o encadeamento é ativado na continuação vs. se não é trocado? Em qual thread a próxima iteração do loop é executada?
Minhas observações mostram (não verificado conclusivamente) que cada iteração começa no mesmo encadeamento (o original) enquanto a continuação é executada em outro. Isso pode realmente ser? Em caso afirmativo, esse é um grau de paralelismo inesperado que precisa ser considerado em relação à segurança de thread do método GetWorkAsync?
ATUALIZAÇÃO: Minha pergunta não é duplicada, como sugerido por alguns. O while (!_quit) { ... }
padrão de código é apenas uma simplificação do meu código real. Na realidade, meu encadeamento é um loop de longa duração que processa sua fila de entrada de itens de trabalho em intervalos regulares (a cada 5 segundos por padrão). A verificação real da condição de encerramento também não é uma simples verificação de campo, conforme sugerido pelo código de amostra, mas sim uma verificação de manipulação de eventos.