ParallelEnumerable
tiene un miembro estático AsParallel
. Si tengo un IEnumerable<T>
y quiero usar Parallel.ForEach
, ¿eso implica que siempre debería estar usando AsParallel
?¿Parallel.ForEach requiere AsParallel()
p. Ej. ¿Son ambas correctas (todo lo demás es igual)?
sin AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
o con AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Hmmm ... ¿qué es exactamente parrallelizing la enumeración? o al menos, ¿cómo se puede separar esa paralelización de la delegación de tarea? – dkackman
@dkackman '.AsParallel()' prepara la numeración para la ejecución en paralelo, específicamente la versión paralela de '.SelectMany()' en este caso. Piense en una enumeración que tiene una fuerte cláusula 'Donde' pero sin orden, podríamos evaluar esa cláusula where simultáneamente en tantos núcleos como sea posible dando el siguiente en la enumeración al siguiente hilo disponible, haciéndolo casi' n' veces más rápido. Lo que hacemos con ese resultado también se puede manejar de la misma manera después, ya sea de forma síncrona en un subproceso o distribuido en los núcleos como está disponible, esa es la parte 'Parallel.ForEach' o' .ForAll', ¿tiene sentido? –
Eso tiene sentido. Gracias Nick. – dkackman