2016-06-17 9 views
1

ich nach dem beschriebenen Muster an: https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/ so bin ich IProgress.Report in meiner Asynchron-Methode mit dem Fortschritt zu berichten.Kann ich warte auf IProgress.Report

public async Task MyFirstTaskAsync(IProgress<T> progress) 
{ 
    progress.report(some T) 
} 

public async Task MySecondTaskAsync(IProgress<T> progress) 
{ 
    progress.report(some T) 
} 

Auf dem UI-Thread, werde ich MyFirstTaskAsync und MySecondTaskAsync nacheinander aufrufen.

var reportProgress1 = new Action<T> (x =>Console.WriteLine("First Step Completed")) 
var reportProgress2 = new Action<T> (x =>Console.WriteLine("Last Step Completed")) 
var progress1 = new Progress<T>(reportProgress1) 
var progress2 = new Progress<T>(reportProgress2) 
await MyFirstTaskAsync(progress1) 
Console.WriteLine("Second Step Comppleted") 
await MySecondTaskAsync(progress2) 
//code in reportProgress1.report can actually be executed at this point... 

hier Mein Problem in reportProgress1.report ist Code tatsächlich nach MyFirstTaskAsync Abschluss erhalten ausgeführt kann, was irgendwie vermasselt den Fortschrittsbericht, weil ich die erste await erwartete können innerhalb der ersten Asynchron-Methode bis zum Fortschrittsbericht erwarten ist auch abgeschlossen.

Ist das ein Verhalten, das ich irgendwie an meinen Bedarf anpassen kann?

Danke.

Bearbeiten: Angenommen, es gibt nicht-asynchronen Code zwischen zwei Aufgaben, und diese drei zusammen vervollständigen den Gesamtprozess und jeder von ihnen wird den Fortschritt während ihrer Ausführung aktualisieren, so dass sie die Benutzeroberfläche in einem aktualisieren müssen Reihenfolge ..

+0

Danke. Ich habe die Frage aktualisiert, um mein Problem zu klären. Im Grunde sind es die Aufgaben, die zusammen einen Gesamtprozess abschließen, also möchte ich, dass ihre Fortschrittsaktualisierungen in einer bestimmten Reihenfolge ablaufen. – Godsent

Antwort

2

Nein, können Sie nicht "erwarten" IProgress.Report. Fortschrittsberichte sind im Wesentlichen Feuer und Vergessen.

können Sie jedoch Ihre eigene Implementierung von IProgress mit entsprechender Semantik verwenden. Reaktive Erweiterungen eignen sich insbesondere dazu, "Datenströme" zu bändigen (in diesem Fall Ströme von Fortschrittsberichten).

+0

Ah..danks.Ich kann sehen, 'Progress.Report' verwendet' SynchronizationContext.Post', um den Code auszuführen und wie Sie sagten, ich denke, das ist nur 'Feuer-und-vergessen' .. gibt es eine einfache Möglichkeit zur Ausführung etwas sofort auf einem SynchronisationContext – Godsent

+0

wird syncronizationContext.Send tun den Trick? – Godsent

+0

@Godsent: Ja, 'Send' ist synchron. –