Compartilhar via


Mesclar as opções de PLINQ

Quando uma consulta está em execução como partições PLINQ paralelas, a seqüência de origem para que vários threads possam trabalhar em partes diferentes simultaneamente, geralmente em segmentos separados. Se os resultados estão a ser consumido em um thread, por exemplo, em um foreach (For Each na Visual Basic) de loop, então os resultados de cada segmento devem ser mesclados novamente em uma seqüência. O tipo de mesclagem PLINQ executa depende dos operadores que estão presentes na consulta. Por exemplo, operadores de impõem uma nova ordem nos resultados devem buffer todos os elementos de todos os threads. Da perspectiva do thread consome (que também é do usuário de aplicativo) uma consulta com buffer completo pode ser executado por um período considerável de tempo antes que ele produz o primeiro resultado. Outros operadores, por padrão, são parcialmente buffered; eles geram seus resultados em lotes. Um operador, ForAll<TSource> não é armazenado em buffer por padrão. Ele gera todos os elementos de todos os threads imediatamente.

Usando o WithMergeOptions<TSource> método, conforme mostrado no exemplo a seguir, você pode fornecer uma dica para PLINQ que indica que tipo de mesclagem para executar.

        Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
                        Where n Mod 2 = 0
                        Select ExpensiveFunc(n)

var scanLines = from n in nums.AsParallel()
                    .WithMergeOptions(ParallelMergeOptions.NotBuffered)
                where n % 2 == 0
                select ExpensiveFunc(n);

For the complete example, see Como: Especificar opções de mesclagem no PLINQ.

Se a consulta específica não oferecer suporte a opção solicitada, a opção apenas será ignorada. Na maioria dos casos, você não precisará especificar uma opção de mesclagem para uma consulta PLINQ. No entanto, em alguns casos você pode encontrar Testando e a medida que uma consulta é executado melhor em um modo não-padrão. Um uso comum desta opção é forçar um operador de mesclagem de bloco para transmitir os seus resultados para fornecer uma interface de usuário mais responsiva.

ParallelMergeOptions

O ParallelMergeOptions enumeração inclui as seguintes opções que especificam, formas de consulta com suporte, como a saída final da consulta é gerou quando os resultados são consumidos em um thread:

  • Not Buffered

    O NotBuffered opção faz com que cada elemento processado a serem retornados de cada thread assim que ele é produzido. Esse comportamento é semelhante a "fluxo" a saída. Se o AsOrdered() operador está presente na consulta, NotBuffered preserva a ordem dos elementos de origem. Embora NotBuffered inicia, produzindo resultados assim que estiverem disponíveis, o tempo total para todos os resultados de produzir pode ainda ser maior do que usando um do outro mesclagem opções.

  • Auto Buffered

    O AutoBuffered opção faz com que a consulta para coletar os elementos em um buffer e, em seguida, periodicamente, produzir o conteúdo do buffer ao mesmo tempo para o thread consome. Isso é análogo ao produzindo dados de origem em "blocos" em vez de usar o "fluxo" comportamento de NotBuffered. AutoBufferedpode demorar mais que NotBuffered para tornar o primeiro elemento disponível no segmento de consumo. O tamanho do buffer e o comportamento exato que resultam não são configurável e podem variar, dependendo de diversos fatores relacionados à consulta.

  • FullyBuffered

    O FullyBuffered opção faz com que a saída de toda a consulta para ser armazenada em buffer antes de qualquer um dos elementos são gerou. Quando você usar esta opção, pode levar mais tempo antes do primeiro elemento está disponível no segmento de consumo, mas os resultados completos ainda podem ser produzidos mais rápido do que usando as outras opções.

Que opções de mesclagem de suporte de operadores de consulta.

A tabela a seguir lista os operadores que oferecem suporte a todos os modos de opção de mesclagem, sujeito às restrições especificadas.

Operador

Restrições

AsEnumerable<TSource>

Nenhum

Cast<TResult>

Nenhum

Concat

Consultas de não-solicitados que tem apenas uma fonte de matriz ou lista.

DefaultIfEmpty

Nenhum

OfType<TResult>

Nenhum

Reverse<TSource>

Consultas de não-solicitados que tem apenas uma fonte de matriz ou lista.

Select

Nenhum

SelectMany

Nenhum

Skip<TSource>

Nenhum

Take<TSource>

Nenhum

Where

Nenhum

Todos os outros operadores de consulta PLINQ podem ignorar as opções de mesclagem fornecido pelo usuário. Alguns operadores de consulta, por exemplo, Reverse<TSource> e OrderBy, não é possível produzir quaisquer elementos até que todos foram produzidos e reordenados. Portanto, quando ParallelMergeOptions é usado em uma consulta que também contém um operador como Reverse<TSource>, o comportamento de mesclagem não será aplicado na consulta até após esse operador produziu resultados.

A capacidade de alguns operadores para lidar com as opções de mesclagem depende do tipo de seqüência de origem e se a AsOrdered operador foi usado anteriormente na consulta. ForAll<TSource>é sempre NotBuffered ; Ele gera seus elementos imediatamente. OrderByé sempre FullyBuffered; ele deve classificar toda a lista antes de ele produz.

Consulte também

Tarefas

Como: Especificar opções de mesclagem no PLINQ

Conceitos

Parallel LINQ PLINQ)