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á awaiting 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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top