Wie integriert sich das neue Feature async / await in C # 5 in die Nachrichtenschleife?

8

Ich hatte keine Gelegenheit, das CTP des neuen C # async / await-Features zu überprüfen, aber ich habe mich gefragt:

Wie integriert es sich in die Nachrichtenschleife? Ich nehme an, dass in einer Windows-Standardanwendung (Winforms, WPF) die Fortsetzungen aufgerufen werden, indem Nachrichten an die Nachrichtenschleife der Anwendung gesendet werden, indem ein Dispatcher oder ähnlich?

Was passiert, wenn ich keine standardmäßige Windows-Nachrichtenschleife verwende? Zum Beispiel in einer GTK # -Anwendung oder in einer Konsolenanwendung (falls diese Funktion überhaupt in einer Konsolenanwendung verwendet werden könnte).

Ich habe das Internet nach Informationen darüber gesucht, aber ohne Erfolg. Kann mir jemand erklären?

    
Grokys 12.10.2011, 21:52
quelle

2 Antworten

5

Es verwendet System.Threading.SynchronizationContext.Current. Sowohl WPF als auch Winforms installieren ihre eigene Version von SynchronizationContext. Welche verwenden ihre Nachrichtenschleife, um den Aufruf von einem Worker-Thread an den Haupt-UI-Thread zurückzumelden. Entsprechend mit Dispatcher.Begin / Invoke und Control.Begin / Invoke ().

Es ist nicht einfach, dies in einer App im Konsolenmodus zu erledigen. Der Hauptthread hat keinen klar definierten "Leerlauf" -Zustand, der Marshalled-Methodenaufrufe auf eine sichere Art und Weise injizieren könnte, um erneute Kopfschmerzen zu vermeiden. Sie könnten es natürlich hinzufügen, aber Sie werden die Nachrichtenschleife so neu erfinden.

    
Hans Passant 12.10.2011, 22:02
quelle
4

Es kommt darauf an, was der "Aufpasser" mit der Fortsetzung macht, die er durchläuft.

Die Implementierung für Task<T> in der BCL verwendet den aktuellen Synchronisationskontext (, es sei denn, Sie fragen es nicht um ConfigureAwait zu verwenden - was bedeutet, dass in WPF / SilverLight der Dispatcher verwendet wird; In Windows Forms verwendet es so etwas wie Control.BeginInvoke und in einem Thread-Pool-Thread wird es nur in einem Thread-Pool-Thread ausgeführt. Beachten Sie, dass es Ihr aktueller Kontext an der Stelle des erwarteten Ausdrucks ist, der wichtig ist, da dies die Aufgabe für die Fortsetzung ist, die ausgeführt wird.

Der verlinkte Blogpost (von Mads Torgersen) erklärt sehr gut, wie alles unter der Haube funktioniert, und ich habe eine eine Reihe von Blog-Posts , die Sie auch nützlich finden können.

    
Jon Skeet 12.10.2011 21:58
quelle