domingo, 13 de diciembre de 2015

C# PLINQ, AsOrdered, AsSequential

Al ejecutar consultas en paralelo es necesario recordar que el proceso no garantiza un orden en particular, como se ve puede observar con el siguiente ejemplo.

using System;
using System.Linq;

namespace MakingParallelQuerySequential
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = Enumerable.Range(0, 20);
            var parallelResult = numbers.AsParallel()
                .Where(i => i % 2 == 0);

            // con Take, usted define cuantos resultados desea obtener
            foreach (int i in parallelResult.Take(5)) Console.WriteLine(i);
    
        }
    }
}

Al ejecutar puede ver el resultado de la consulta, la cual no se encuentra en un orden en particular. El resultado del código depende los recursos disponibles del CPU. Si usted quiere asegurar de que los resultados se encuentren ordenados use el operador AsOrdered. El proceso se ejecuta de forma paralela, pero el resultado es colocado en un buffer y ordenado. Como se ve en el siguiente ejemplo.

using System;
using System.Linq;

namespace MakingParallelQuerySequential
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = Enumerable.Range(0, 20);
            var parallelResult = numbers.AsParallel().AsOrdered()
                .Where(i => i % 2 == 0);

            // con Take, usted define cuantos resultados desea obtener
            foreach (int i in parallelResult.Take(5)) Console.WriteLine(i);

        }
    }
}


Si usted tiene una consulta compleja que pueda beneficiarse del procesamiento en paralelo pero tiene algunas partes que deberían ser realizados en forma secuencia, puede usar AsSequential.

using System;
using System.Linq;

namespace MakingParallelQuerySequential
{
    class Program
    {
        static void Main(string[] args)
        {
            var numbers = Enumerable.Range(0, 20);
            var parallelResult = numbers.AsParallel().AsOrdered()
                .Where(i => i % 2 == 0).AsSequential();

            // con Take, usted define cuantos resultados desea obtener
            foreach (int i in parallelResult.Take(5)) Console.WriteLine(i);

        }
    }
}

Referencia:
Exam Ref 70-483 Programming in C#








No hay comentarios.:

Publicar un comentario