Ho abituato ad usare Parallel.For() nelle estensioni parallele di Net in quanto è un modo semplice di parallelizzare codice senza dover aprire manualmente e mantenere fili (che può essere complicato). Ora sto osservando un ciclo infinito (fare qualcosa finché non lo segnale di interromperlo) che desidero parallelizzare, non c'è un argomento libero da Parallel.For() sovraccarico per fare questo, quindi ci chiedevamo quale sarebbe l'approccio migliore qui essere. In linea di massima ho potuto solo fare qualcosa di simile: (?)Qual è il modo migliore per ottenere un loop infinito parallelo?
Parallel.For(0, int.Max)
Ma sto ritenendo sospetto che potrebbe non essere un modello atteso/efficiente per la logica di lavoro di partizionamento per gestire
Un'altra opzione è qualcosa di simile:
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
Ma ciò sembra inelegante e può anche comportare un partizionamento del lavoro inefficiente.
questo momento il mio istinto è quello di farlo manualmente creando e mantenendo le mie discussioni, ma sarei interessato a ottenere un feedback/opinioni su questo. Grazie.
UPDATE === ===
sto utilizzando una versione semplificata del codice dal l'articolo del risposta accettata (ho rimosso il parametro ParallelOptions). Ecco il codice ...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
Un esempio d'uso potrebbe essere:
Func<bool> whileCondFn =() => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
// Do stuff.
});
c'è qualche modello di threading che è possibile consumare – MethodMan