2010-11-01 10 views
5

Ho diversi Parallel.Per operazioni in successione.Successive .NET Parallel For - Blocco dopo ogni

Attualmente sto esaminando ogni Parallel.Per il valore di ritorno ParallelLoopResult e dormo per 20 millisecondi finché il membro IsCompleted non è impostato su true.


Dim plr as ParallelLoopResult 

plr = Parallel.For(...) 

while not plr.IsCompleted 
    Thread.Sleep(20) 
end while 

plr = Parallel.For(...) 

while not plr.IsCompleted 
    Thread.Sleep(20) 
end while 

. 
. 
. 

Come si aggiunge un blocco di livello di kernel (cioè WaitHandle) al posto del ciclo e Thread.Sleep? Esiste un evento di completamento che Parallel.For si attiva? Parallel. Per fornire un tale meccanismo?

risposta

4

Il Parallel.For completerà tutto il codice per il quale è stato chiamato. Il IsCompleted restituisce solo false quindi il ciclo è stato interrotto.

Da http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallelloopresult.aspx:

Se IsCompleted restituisce true, quindi il ciclo corse a compimento, in modo tale che sono state eseguite tutte le iterazioni del ciclo. Se IsCompleted restituisce false e LowestBreakIteration restituisce null, è stata utilizzata una chiamata a Stop per interrompere prematuramente il ciclo. Se IsCompleted restituisce false e LowestBreakIteration restituisce un valore integrale non null, Break è stato utilizzato per terminare il ciclo prematuramente.

+0

Vero, ma non risponde alla mia domanda su come attendere il completamento del ciclo utilizzando un costrutto a livello del kernel. – ColorEyes

+0

Ma non c'è niente da aspettare. Pensa che quello che stai chiedendo è come puoi dormire il thread fino a quando alcuni segnali anche che 'IsCompleted' è cambiato. Il problema è che 'IsCompleted' non cambierà mai dopo il completamento di' Parallel.For'. –

+0

Se creo un WaitHandle, come potrei segnalare l'handle di attesa al termine di Parallel.For? – ColorEyes

1

Non puoi ottenere WaitHandle per Parallel.For() e non avete bisogno di - chiamata sincrona (tutte le iterazioni saranno completati dopo la chiamata è finito). Se è necessario eseguire il ciclo stesso su altri thread, non solo le iterazioni, è necessario eseguirne il wrapping in Task o Thread e tali oggetti forniranno maniglie di attesa. Ma se stai aspettando risultati sullo stesso thread che chiami Parallel.For() (come nel tuo codice di esempio), non ha alcun senso.