Wann würde ich Task.Yield () verwenden?
Bin ich mit async/await und Task
viel, war aber nie mit Task.Yield()
und um ehrlich zu sein, auch mit den Erklärungen verstehe ich nicht, warum ich brauchen würde, diese Methode.
Kann jemand geben ein gutes Beispiel, wo Yield()
erforderlich ist?
InformationsquelleAutor der Frage Krumelur | 2014-03-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
async
/await
gibt es keine Garantie, dass die Methode, die Sie aufrufen, wenn Sieawait FooAsync()
wird asynchron ausgeführt wird. Die interne Implementierung ist frei, um zurückzukehren, die Verwendung eines vollständig synchronen Pfad.Wenn Sie eine API-wo es wichtig ist, dass Sie nicht blockieren und führen Sie einige code asynchron, und es gibt eine chance, dass die aufgerufene Methode wird synchron ausgeführt (effektiv blockieren), mit
await Task.Yield()
zwingen wird, Ihre Methode asynchron, und die Steuerung wieder an diesem Punkt. Der rest des Codes wird ausgeführt, zu einem späteren Zeitpunkt (an dem Punkt ist, ist es noch synchron laufen) auf den aktuellen Kontext.Dies kann auch nützlich sein, wenn Sie eine asynchrone Methode, die erfordert, dass einige "Dauerbrenner" Initialisierung, dh:
Ohne die
Task.Yield()
Aufruf der Methode wird synchron ausgeführt ganzen Weg bis zu den ersten Anruf zuawait
.InformationsquelleAutor der Antwort Reed Copsey
Intern
await Task.Yield()
einfach in die Warteschlange der Fortsetzung auf die aktuelle Synchronisierung-Kontext oder auf einem random-pool-thread, wennSynchronizationContext.Current
istnull
.Ist es effizient umgesetzt als custom "awaiter". Einen weniger effizienten code produzieren, der identisch Wirkung könnte so einfach wie diese:
Task.Yield()
kann verwendet werden, als ein short-cut für einige schräge Ausführung-flow-änderungen. Zum Beispiel:Sagte, ich kann nicht denken von jedem Fall, wo
Task.Yield()
kann nicht ersetzt werden, mitTask.Factory.StartNew
w/richtigen task scheduler.Siehe auch:
"await Task.Yield()" und seine alternativen
Aufgabe.Ertrag - Reale Verwendungen?
InformationsquelleAutor der Antwort Noseratio
Task.Yield()
verwendet werden können und mock-Implementierungen von async-Methoden.InformationsquelleAutor der Antwort mhsirig