Поделиться через


Практическое руководство. Задание режима выполнения в PLINQ

В этом примере показан способ принудительного обхода PLINQ его эвристики по умолчанию и параллелизации запроса независимо от формы запроса.

Предупреждающее замечаниеВнимание

Этот пример демонстрирует использование и может выполняться медленнее, чем аналогичный последовательный запрос LINQ to Objects.Дополнительные сведения об увеличении скорости см. в разделе Общее представление об ускорении выполнения в PLINQ.

Пример

Private Shared Sub ForceParallel()
    Dim customers = GetCustomers()
    Dim parallelQuery = (From cust In customers.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) _
        Where cust.City = "Berlin" _
        Select cust.CustomerName).ToList()
End Sub
// Paste into PLINQDataSample class.
static void ForceParallel()
{
    var customers = GetCustomers();
    var parallelQuery = (from cust in customers.AsParallel()
                            .WithExecutionMode(ParallelExecutionMode.ForceParallelism)
                         where cust.City == "Berlin"
                         select cust.CustomerName)
                        .ToList();
}

PLINQ предназначен для использования возможностей параллелизации. Однако не все запросы лучше выполнять параллельно. Например, если запрос содержит отдельный пользовательский делегат, который выполняет мало работы, запрос обычно выполняется быстрее последовательно. Это происходит потому, что для выполнения параллелизации требуется больше ресурсов, чем для полученного ускорения. Таким образом, PLINQ не выполняет параллелизацию каждого запроса автоматически. Он сначала проверяет форму запроса и входящие в него различные операторы. На основе этого анализа PLINQ в режиме выполнения по умолчанию может потребоваться выполнить некоторые части или весь запрос последовательно. Однако в некоторых случаях о запросе может быть известно больше, чем PLINQ способен определить на основе анализа. Например, может быть известно, что делегат требует большого количества ресурсов и что запрос определенно лучше обрабатывать параллельно. В таких случаях можно использовать метод WithExecutionMode<TSource> и указать значение ForceParallelism, чтобы PLINQ всегда выполнял запрос параллельно.

Компиляция кода

Вырежьте и вставьте этот код в Пример данных PLINQ, и вызовите метод из Main.

См. также

Ссылки

AsSequential<TSource>

Основные понятия

Parallel LINQ (PLINQ)

Журнал изменений

Дата

Журнал

Причина

Май 2010

Добавлено примечание о сравнении использования и ускорения.

Обратная связь от клиента.