Frage

Microsoft kündigte die Visual Studio Async CTP heute (28. Oktober 2010), dass eine Einführung in den async und await Schlüsselwörter in C # / VB für asynchrone Methodenausführung.

Zuerst dachte ich, dass der Compiler die Schlüsselwörter in der Schaffung eines Themas übersetzt, sondern nach dem Whitepaper und a href Anders Hejlsberg <=" http://player.microsoftpdc.com/Session/1b127a7d-300e-4385-af8e-ac747fee677a "rel =" noreferrer "> PDC Präsentation (bei 31:00) die asynchrone Operation geschieht vollständig auf dem Haupt-Thread.

Wie kann ich eine Operation parallel auf dem gleichen Thread ausgeführt haben? Wie ist es technisch möglich und was ist die Funktion übersetzt eigentlich in IL?

War es hilfreich?

Lösung

Es funktioniert ähnlich wie das yield return Schlüsselwort in C # 2.0.

Eine asynchrone Methode ist nicht tatsächlich eine gewöhnliche sequentielle Methode. Es wird in eine Zustandsmaschine zusammengestellt (ein Objekt) mit einem gewissen Zustand (lokale Variablen in Felder des Objekts gedreht). Jeder Codeblock zwischen zwei Verwendungen von await ist eine „Stufe“ der Zustandsmaschine.

Das bedeutet, dass, wenn das Verfahren beginnt, läuft es nur den ersten Schritt und dann die Zustandsmaschine kehrt und plant einige Arbeit getan werden - wenn die Arbeit getan ist, wird es den nächsten Schritt der Zustandsmaschine ausgeführt werden. Zum Beispiel dieses Code:

async Task Demo() { 
  var v1 = foo();
  var v2 = await bar();
  more(v1, v2);
}

Will etwas wie übersetzt werden:

class _Demo {
  int _v1, _v2;
  int _state = 0; 
  Task<int> _await1;
  public void Step() {
    switch(this._state) {
    case 0: 
      this._v1 = foo();
      this._await1 = bar();
      // When the async operation completes, it will call this method
      this._state = 1;
      op.SetContinuation(Step);
    case 1:
      this._v2 = this._await1.Result; // Get the result of the operation
      more(this._v1, this._v2);
  }
}

Der wichtigste Teil ist, dass es nur die SetContinuation Methode verwendet, um anzugeben, dass, wenn der Vorgang abgeschlossen ist, sollte es die Step Methode aufrufe wieder (und die Methode weiß, dass es sollte das zweite Bit des ursprünglichen Codes mit dem _state Feld läuft) . Sie können sich leicht vorstellen, dass die SetContinuation so etwas wie btn.Click += Step sein würde, die vollständig auf einem einzigen Thread laufen würde.

Das asynchrone Programmiermodell in C # ist sehr nah an F # asynchronen Workflows (in der Tat, es ist im Wesentlichen die gleiche Sache, abgesehen von einigen technischen Details), und reaktive Single-Threaded-GUI-Anwendungen zu schreiben async Verwendung ist durchaus ein interessantes Gebiet - zumindest glaube ich so - siehe zum Beispiel dieser Artikel (vielleicht sollte ich eine C # Version schreiben jetzt: -))

.

Die Übersetzung ist ähnlich wie Iteratoren (und yield return) und in der Tat war es möglich, Iteratoren zu verwenden asynchrone Programmierung in C # früher zu implementieren. Ich schrieb ein Artikel über das vor einer Weile - und ich denke, es kann man noch einige geben Einblick darüber, wie die Übersetzung funktioniert.

Andere Tipps

  

Wie kann ich eine Operation parallel auf dem gleichen Thread ausgeführt haben?

Sie können nicht. Asynchronität ist nicht "Parallelität" oder "Parallelität" . Asynchronität könnte mit Parallelität implementiert werden, oder es könnte nicht sein. Es könnte durch Aufbrechen der Arbeit in kleine Stücke umgesetzt werden, wobei jedes Stück Arbeit in einer Warteschlange setzen, und dann jedes Stück Arbeit ausgeführt wird, wenn der Faden sonst nichts zu tun werden passiert.

Ich habe eine ganze Reihe von Artikeln bekommt auf meinem Blog darüber, wie all dieses Zeug funktioniert; die man direkt Germane auf diese Frage wahrscheinlich am Donnerstag nächster Woche steigen. Beobachten

http://blogs.msdn.com/b/ericlippert/archive / tags / Asynchron /

für Details.

Wie ich es verstehe, was die async und await Keywords zu tun ist, dass jedes Mal, wenn eine async Methode, um das await Schlüsselwort verwendet, wird der Compiler den Rest des Verfahrens in eine Fortsetzung drehen, die geplant wird, wenn der Asynchron-Vorgang abgeschlossen ist. Das erlaubt async Methoden mit dem Anrufer sofort wieder und die Arbeit wieder aufnehmen, wenn der Async Teil getan.

Nach den vorliegenden Unterlagen es eine Menge Details zu ihm sind, aber wenn ich nicht irre, das ist der Kern von ihm.

Wie ich es der Zweck der Asynchron-Methoden sieht, ist nicht viel Code parallel laufen zu lassen, aber Asynchron-Methoden in eine Anzahl von kleinen Stücken zerkleinern, dass bei Bedarf wieder aufgerufen werden. Der entscheidende Punkt ist, dass die Compiler all komplexe Verdrahtung von Rückrufen behandeln Aufgaben / Fortsetzungen verwenden. Dies reduziert nicht nur die Komplexität, sondern ermöglicht asynchrones Verfahren mehr oder weniger wie Synchroncode traditionellen geschrieben werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top