9 Stimmen

Wie kann man asynchrone Operationen sequentiell ausführen?

Jetzt verwende ich etwas Ähnliches wie diese Konstruktion

A.Completed += () =>
{ B.Completed += () =>
  {  C.Completed += () =>
     {
       //
     }
     C();
   }
   B();
 }  
 A();

Und nicht sehr glücklich damit. Gibt es eine bessere, sauberere Art und Weise zu tun, diese Art von sequent/konkurrierende Aktion Ausführung?

Ich habe einen Blick auf Rx-Framework, aber es ist für andere Aufgaben konzipiert und sieht aus wie Weg Overkill für mein Problem.

8voto

Chris Pitman Punkte 12775

Es besteht keine Notwendigkeit, die Ereignisse "Abgeschlossen" zu verschachteln, es sei denn, jemand ruft tatsächlich B oder C auf, bevor A abgeschlossen ist. Wenn Sie es herauslösen, sieht es folgendermaßen aus:

A.Completed += () => { B(); };
B.Completed += () => { C(); };  
C.Completed += () => { //   }; 

A();

Ich denke, wenn man die Verschachtelung entfernt, wird es viel sauberer.

4voto

Giorgi Punkte 29625

Werfen Sie einen Blick auf ReactiveUI . Es basiert auf Rx und wird Ihren Code stark vereinfachen. Hier ist ein Beispiel: Aufrufen von Webdiensten in Silverlight mit ReactiveXaml

2voto

DaeMoohn Punkte 1047

Sie können einen Blick auf TPL werfen. Sie können Code wie in diesem Thread schreiben: Link

1voto

Adam Rackis Punkte 81499

Es ist nicht viel Reiniger, aber Sie könnten einen Blick darauf werfen BackgroundWorker .

BackgroundWorker A = new BackgroundWorker();
A.DoWork += (s, e) => AMethod();
A.RunWorkerCompleted += (s, e) => BMethod();

BackgroundWorker B = new BackgroundWorker();
B.RunWorkerCompleted += (s, e) => CMethod();

//etc

Sie reduzieren den Code nicht wirklich, aber ich würde sagen, es ist viel sauberer.

1voto

Timwi Punkte 62977

Warten Sie auf C# 5.0 und verwenden Sie die neue async y await Schlüsselwörter.

Hier sind einige vorläufige Links zu diesem Thema:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X