Comportamiento de la configuración de ConfigureAwait y SynchronisationContext
-
21-12-2019 - |
Pregunta
En su respuesta esteban explicó que cuando ConfigureAwait(false)
se llama, el resto del método se ejecutará en un subproceso del grupo de subprocesos a menos que el Task
estás await
El proceso ya está completo.
Lo que está claro:si uso ConfigureAwait(false)
todo lo que se ejecute después de la llamada asincrónica se ejecutará en un subproceso del grupo de subprocesos y, por lo tanto, no se ejecutará en UI SynchronizationContext; de lo contrario (especialmente necesario para cosas basadas en UI como textBox1.Text = data.Property
) se ejecuta dentro de UI SynchronizationContext.
Lo que no entiendo es:Hace await
no significa que el Task
estoy esperando es siempre ¿Completado antes de que se apliquen los métodos?Entonces, ¿cómo es posible que la tarea no se complete antes de continuar?
Solución
Imagina algo como esto
var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
Creo que es fácil ver que la tarea podría completarse incluso antes de que await task
llamar.
En este caso, el código después de await se ejecutará en el mismo contexto, incluso si ha utilizado .ConfigureAwait(false)
.
Otros consejos
Es importante comprender el orden de precedencia.En particular, el operador de punto (.
) tiene mayor prioridad que await
.Entonces, cuando lo hagas:
await SomeMethodAsync().ConfigureAwait(false);
Eso es idéntico a:
var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;
Entonces el ConfigureAwait
Se evalúa antes del await
expresión, que en realidad hace la espera (asincrónica).