El runtime determina si la consulta requiere un proceso paralelo. Cuando hacemos esto, este genera un objeto Task y inicia la ejecución de este. Si usted quiere forzar PLINQ dentro de una consulta paralela, puede usar el método
WithExecutionMode y especificar que la consulta debería ejecutar en un proceso paralelo.
using System;
using System.Linq;
namespace MakingParallelQuerySequential
{
class Program
{
static void Main(string[] args)
{
var numbers = Enumerable.Range(0, 50);
var parallelResult = numbers.AsParallel()
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
.Where(i => i % 2 == 0).AsSequential();
foreach (int i in parallelResult.Take(5)) Console.WriteLine(i);
}
}
}
PLINQ esta diseñado para explotar las facultades del paralelismo. Sin embargo no todas las consultas se benefician de la ejecución en paralelo. Por ejemplo, cuando una consulta contiene un solo delegado que hace un trabajo muy pequeño, la consulta podría ejecutarse más rápidamente de forma secuencial. Esto es porque la sobrecarga inherente a la ejecución en paralelo requiere más recursos que la consulta simple. Es por eso que PLINQ no hace de forma automática cualquier consulta. PLINQ examina primero la estructura de la consulta y los operadores que este contiene. Basado en este análisis, PLINQ usa por omisión el modo de ejecución default, podría decidir ejecutar algo o todo la consulta de forma secuencial. Sin embargo, en algunos casos usted podría conocer mas de la consulta que lo que PLINQ pueda determinar desde su análisis. Por ejemplo, usted podría saber que el delegado requiere más recursos, y que la consulta se puede beneficiar del proceso en paralelo. En este caso use el método
WithExecutionMode<TSource> y especificar el valor
ForceParallelism para instruir a PLINQ a que siempre ejecute la consulta en forma paralela.
Referencia:
Exam Ref 70-483 Programming in C#
https://msdn.microsoft.com/en-us/library/dd547138(v=vs.110).aspx
No hay comentarios.:
Publicar un comentario