2012-05-23 6 views
5

Hallo Ich habe _noOfThreads als definierte Aufgaben zu einer Zeit ausgeführt werden. Also fahre ich fort, die Aufgaben mit % Operator und am Ende der Schleife habe ich Tasks.WaitAll. Dies ist das Code-Snippet.Task.WaitAll wartet nicht auf untergeordnete Task?

for (int index = 0; index < count; index++) 
{ 

       if (index < _noOfThreads) 
        tasks[index] = Task.Factory.StartNew(somedelegate); 
       else 
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
    Task.WaitAll(tasks); 

Allerdings merke ich, dass es nicht darauf wartet, dass untergeordnete Aufgaben abgeschlossen werden. Sobald die übergeordneten Aufgaben abgeschlossen sind, wird die nächste Zeile nach Task.WaitAll ausgeführt. Wie ändere ich diesen Code, um auch auf untergeordnete Aufgaben zu warten?

+0

möglich duplicate von [Task.ContinueWith funktioniert nicht wie ich erwartet] (http://StackOverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

Auf eine Randnotiz, was Sie scheinen, hier zu tun, entscheidet über Aufgabenplanung. Wenn Sie die Terminplanung anpassen möchten, können Sie sich den [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx) ansehen. Das heißt, der Standard-Scheduler ist schon ziemlich gut darin, das System nicht mit Threads zu überladen, wenn eine große Anzahl von Aufgaben in die Warteschlange gestellt wird. –

+0

@Dan: Das ist nicht meine Angelegenheit. Ich weiß nicht, dass ich das TaskScheduler geben möchte. Ich habe eine Variable und möchte nur so viele Aufgaben wie diese Variable starten. Kurz gesagt, ich möchte etwas wie Semaphore simulieren, wo Sie die Anzahl der Threads definieren und nur diese Anzahl an Threads kann zu einer bestimmten Zeit in dieses Codeelement eingehen. –

Antwort

8

Ich glaube, Sie Ihre Aufgaben, wie sie die Zuweisung:

Tasks[] tasks = new Task[ _noOfThreads]; 
Code ändern

zu sein: es

Tasks[] tasks = new Task[count]; 

for (int index = 0; index < count; index++) 
{ 

    if (index < _noOfThreads) 
     tasks[index] = Task.Factory.StartNew(somedelegate); 
    else 
     tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
Task.WaitAll(tasks); 

Geben Sie einen Versuch! Viel Glück :)

3

Sie warten nur auf die ursprüngliche Aufgabe. Um darauf zu warten, dass alle Fortsetzungen abgeschlossen sind, müssen Sie WaitAll für die Fortsetzungsaufgaben aufrufen. Einfache Möglichkeit, dies zu erreichen, wäre jede Fortsetzung Aufgabe neu zuzuweisen wieder auf die ursprüngliche Variable, so dass Sie nur auf den letzten Fortsetzungen warten:

else 
    tasks[index % _noOfThreads] = 
     tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
         TaskContinuationOptions.AttachedToParent); 

Siehe auch this related question.

Verwandte Themen