Comportamento dell'impostazione Configureawait e sincronizzazioneContext
-
21-12-2019 - |
Domanda
Nel suo Risposta Stephen ha spiegato che quando ConfigureAwait(false)
è chiamato il resto del metodo verrà eseguito su un filo del pool di filettatura a meno che il Task
sia await
ing sia già completo.
Cos'è chiaro: se utilizzo ConfigureAwait(false)
Tutto eseguito dopo che la chiamata asincrona verrà eseguita su un filo del pool di filettatura e quindi non viene eseguito nel sincronizzazione dell'interfaccia utente, altrimenti (necessaria escresialmente per cose basate sull'Ui come textBox1.Text = data.Property
) Si esaurisce all'interno di UI SynchronizationContext.
Quello che non capisco è: await
non significa che il Task
che sto aspettando è sempre completato prima che i metodi stia succedendo?Quindi, come può il compito non essere completato prima di andare avanti?
Soluzione
Immagina qualcosa di simile a questo
var task = obj.SomeTaskAsync();
// do some lengthy computation
var value = await task.ConfigureAwait(false);
.
Penso che sia facile vedere che l'attività potrebbe essere completata anche prima della chiamata await task
.
In questo caso il codice dopo l'attenditore verrà eseguito nello stesso contesto, anche se hai utilizzato .ConfigureAwait(false)
.
Altri suggerimenti
È importante capire l'ordine della precendenza.In particolare, l'operatore del punto (.
) è di priorità più alta del await
.Quindi, quando fai:
await SomeMethodAsync().ConfigureAwait(false);
.
è identico a:
var task = SomeMethodAsync();
var awaitable = task.ConfigureAwait(false);
await awaitable;
.
Quindi, il ConfigureAwait
viene valutato prima dell'espressione await
, che effettivamente fa l'attesa (asincrono).