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

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top