2012-05-23 11 views
5

Ciao, ho _noOfThreads come attività definite da eseguire alla volta. Quindi continuo a svolgere le attività utilizzando l'operatore % e alla fine del ciclo ho Tasks.WaitAll. Questo è lo snippet di codice.Task.WaitAll non attende l'attività figlio?

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); 

Tuttavia, noto che non attende il completamento delle attività secondarie. Non appena vengono completate le attività principali, viene eseguita la riga successiva dopo Task.WaitAll. Come posso modificare questo codice per attendere anche le attività secondarie?

+0

possibile duplicato del [Task.ContinueWith non funziona come mi aspettavo] (http://stackoverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

Su un lato nota, cosa sembra che tu stia facendo qui sta decidendo la pianificazione delle attività. Se si desidera personalizzare la pianificazione, è possibile visualizzare derivando da [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx). Detto questo, lo scheduler predefinito fa già un buon lavoro senza sovraccaricare il sistema con i thread quando un numero elevato di attività viene accodato. –

+0

@Dan: Questa non è la mia preoccupazione. Non so voglio darlo a TaskScheduler. Ho una variabile e voglio avviare Task solo come quella variabile. In breve, voglio simulare qualcosa come Semaphore in cui definisci il numero di thread e solo quel numero di thread può inserire quel pezzo di codice in un dato momento. –

risposta

8

penso che si assegnano i vostri compiti come:

Tasks[] tasks = new Task[ _noOfThreads]; 

modificare il codice per essere:

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); 

fare un tentativo! Buona fortuna :)

3

Stai aspettando solo l'attività originale. Per attendere il completamento di tutte le operazioni, è necessario chiamare WaitAll per le attività di continuazione. modo semplice per ottenere questo risultato sarebbe quello di riassegnare ogni attività continuazione torna alla variabile originale in modo si è in attesa solo sulle continuazioni finali:

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

Vedi anche this related question.

Problemi correlati