Frage

Frage

Dies ist wahrscheinlich etwas einfach ich verpasst habe.

Lassen Sie uns sagen ich tun (in loveley VB):

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Hinweis t1.ContinueWith wird zweimal verwendet. Was ist die bevorzugte Reihenfolge der Ausführung für diese Aufgaben? Für mich ist es entweder zufällig oder falsch.

Warum?

Der Grund, warum ich dieses ...

tun wollen
  1. Erstellen Sie eine Aufgabe greifen und zurückgegebenen Daten
  2. Gefolgt von einer Aufgabe, die "Art out" der Benutzeroberfläche auf TaskScheduler.FromCurrentSynchronizationContext() (UI-Thread)
  3. Folgen Sie den ursprünglichen Daten-Task-Grabbing durch die Daten in einen langen Bericht Umwandlung (dauert ewig)
  4. Zurück auf dem UI-Thread, weisen Sie diesen Bericht eine Vorschau Kontrolle
  5. Cleanup (loswerden meine Fortschritte Animation usw.)

Dies ist komplizierter durch die Tatsache, dass Schritt 4 optional .

In der Mitte all dies sind meine Aufgaben nach hinten Satz Elementeigenschaften Biege so die Benutzeroberfläche und Aufgaben können schön spielen. Vielleicht sollte ich den Task-Ergebnis ganz Graben und bleiben nur meine Membervariablen zu Synclocking. Sie sind alle nur einmal afterall zugeordnet.

Danke, Tom

War es hilfreich?

Lösung

Die Aufgaben werden in einer LIFO-Reihenfolge für eine bessere Speicherlokalizität ausgeführt. Dies kann geändert natürlich, wenn Sie einen Differnt Scheduler verwenden oder wenn MS entscheidet zu „reparieren“ das Original. Ich glaube nicht, dass Sie sich auf dieses Verhalten verlassen sollten. Stattdessen könnten Sie Ihre Aufgabe auspacken Arbeiten an der vorherige Aufgabe fortzusetzen, wenn es abgeschlossen ist. Ansonsten warten Sie auf die falsche Sache. Mehr Infos finden Sie hier: http://msdn.microsoft.com/en- us / library / ee795275.aspx

Andere Tipps

Wenn Sie die Reihenfolge zwischen T2 und T3 zu erzwingen, warum gehst du nicht einfach ändern, so dass T3 von T2 weiter statt t1?

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Wenn T2 und T3 lang liefen sie parallel ausgeführt werden, wie Sie es geschrieben hatte.

Es gibt keine Notwendigkeit, einen benutzerdefinierten Task-Scheduler zu erstellen, dieses Verhalten zu ändern.

Basierend auf Ihren Kommentar zu Ian Mercer Antwort würde ich vorschlagen, so etwas wie

Task t1 = new Task((_)=>Console.WriteLine("t1"));
Task tn = secondTaskCondition ? t1.ContinueWith((_)=>Console.WriteLine("t2")) : t1;
Task t3 = tn.ContinueWith((_)=>Console.WriteLine("t3"));
t1.Start();

Dies gibt Ihnen deterministische Ausführung und noch können Sie Ihren Workflow mit optionalen Einheiten zusammensetzen.

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