2012-04-12 8 views
0

Ich habe eine solche Situtation:Foreach warten Aufgabe abzuschließen

 foreach (var item in listBoxFileNames.SelectedItems) 
     { 
      MessageBox.Show("I am not waiting"); 
      CancellationTokenSource tokenSourcve = new CancellationTokenSource(); 
      CancellationToken token = tokenSourcve.Token; 

      Task task1 = new Task(() => 
       { 
        ProcessDatas(); // method 
       } 
       , token); 

      task1.Start(); 
     } 

Ich möchte foreach machen Aufgabe der Fertigstellung zu warten. Aber es wartet nicht. Es zeigt mir MessageBox unmittelbar nach jeder messagBox.

+0

Warum erstellen Sie eine Aufgabe, wenn Sie das Warten auf jede Aufgabe blockieren? –

+0

Der Benutzer wählt einige Dateien und wählt alle Dateien aus, die er verarbeiten möchte. foreach erhält alle ausgewählten Elemente. Aber es muss warten, bis die vorherige Aufgabe beendet ist. –

Antwort

9

Ja, du bist die Aufgabe beginnen, die dann in ausführen wird der Hintergrund. Wenn Sie möchten, dass sich die Schleife vollständig synchron verhält, rufen Sie einfach ProcessDatas() nicht in einer Aufgabe auf. Sie könnte starten Sie es und warten Sie dann bis es zu beenden - aber es ist nicht klar, welchen Nutzen das Ihnen geben würde.

Wenn Sie wollen starten alle Aufgaben parallel, aber dann auf sie warten darauf, könnten Sie ein List<Task> erstellen und dann Task.WaitAll nennen - oder einfach nur Parallel.ForEach verwenden, um mit zu beginnen.

+0

Aber das Fenster antwortet mir nicht. –

+0

@FerhadJabiyev: Es ist nicht klar, was dein Kommentar bedeutet, noch, in welchem ​​Thread dein Code läuft oder was du erreichen willst. –

+0

Könnten Sie mir bitte zeigen, was ich in meinem Code ändern muss? Warum arbeitet Task.Wait() nicht in meinem Code, wenn ich es nach task1.start() anzeige. Foreach wartet nicht ... –

0

Afaik Sie können nur rufen Sie die Task.Wait()

+0

© habe ich schon benutzt. Es wartet nicht. –

0

Ausprobieren Verwenden Sie diesen Code

task1.Wait(); 

und lesen diese Task

+0

© habe ich schon benutzt. Es wartet nicht. –

1

Können Sie nicht ein Bool machen, das wahr wird, sobald die Aufgabe erledigt ist, dann den Rest in eine if (bool) Schleife legen?

+1

Willst du damit sagen, dass er etwas tun soll, wie 'während (! Beendet) {/ * tue nichts * /}'? Das ist eine schreckliche Idee, denn es verschwendet CPU, die keine nutzlose Arbeit macht. – svick

+0

@svick Okay, ich habe gerade die erste mögliche Lösung geschrieben, die mir einfiel. Es war nur eine Idee, keine fertige Antwort. Vielleicht hätte es besser als Kommentar gepasst: P (neu hier) – Charp

Verwandte Themen