O comportamento da configuração ConfigureAwait e SynchronisationContext
-
21-12-2019 - |
Pergunta
Em sua responder Stephen explicou que quando ConfigureAwait(false)
é chamado o resto do método será executado em um thread do pool a menos que o Task
você está await
ing já está completo.
O que é claro:Se eu usar ConfigureAwait(false)
tudo executado após a chamada assíncrona será executado em um thread do pool e, portanto, não executar a INTERFACE do usuário SynchronizationContext, caso contrário (escpecially necessários para a INTERFACE do usuário com base em coisas como textBox1.Text = data.Property
) é executado dentro de INTERFACE do usuário SynchronizationContext.
O que eu não entendo é:Não await
não significa que o Task
Eu estou à espera é sempre concluída antes de os métodos está acontecendo?Como, então, a Tarefa não será concluída antes de ir?
Solução
Imagine algo como isto
var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
Eu acho que é fácil ver que a tarefa pode ser concluída antes mesmo de o await task
chamada.
Nesse caso, o código após o aguardam será executado no mesmo contexto, mesmo se você tiver usado .ConfigureAwait(false)
.
Outras dicas
É importante entender o precendence ordem.Em particular, o operador ponto (.
) é a prioridade mais alta do que await
.Assim, quando você fizer:
await SomeMethodAsync().ConfigureAwait(false);
Isso é idêntico a:
var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;
Assim, o ConfigureAwait
é avaliada antes da await
expressão, o que realmente faz a (assíncrono) de espera.