Erg, estoy tratando de encontrar estos dos métodos en el BCL usando Reflector, pero no puedo localizarlos. ¿Cuál es la diferencia entre estos dos fragmentos?
UNA:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
SI:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
¿Existen diferentes consecuencias de usar uno sobre el otro? (Suponga que lo que sea que esté haciendo en los cuerpos entre corchetes de ambos ejemplos es seguro para subprocesos).
fuente
La diferencia es que B no es paralelo. Lo único que
AsParallel()
hace es que se ajusta alrededor de aIEnumerable
, de modo que cuando usa métodos LINQ, se usan sus variantes paralelas. El envoltorioGetEnumerator()
(que se usa detrás de escena en elforeach
) incluso devuelve el resultado de la colección originalGetEnumerator()
.Por cierto, si desea ver los métodos en Reflector,
AsParallel()
está en laSystem.Linq.ParallelEnumerable
clase en elSystem.Core
ensamblado.Parallel.ForEach()
está en elmscorlib
ensamblado (espacio de nombresSystem.Threading.Tasks
).fuente
.Select()
, llamaParallelEnumerable.Select()
y no lo normalEnumerable.Select()
.El segundo método no será paralelo, la forma correcta de usar AsParallel () en su ejemplo sería
fuente