Практическое руководство. Задание режима выполнения в PLINQHow to: Specify the Execution Mode in PLINQ

В этом примере показано, как принудительно отключить эвристический анализ PLINQ по умолчанию, чтобы параллелизовать запрос независимо от его формы.This example shows how to force PLINQ to bypass its default heuristics and parallelize a query regardless of the query's shape.

Предупреждение

Этот пример предназначен для демонстрации использования и может выполняться не быстрее аналогичного последовательного запроса LINQ to Objects.This example is intended to demonstrate usage, and might not run faster than the equivalent sequential LINQ to Objects query. См. дополнительные сведения об ускорении выполнения в PLINQ.For more information about speedup, see Understanding Speedup in PLINQ.

ПримерExample

// 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();
}
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

PLINQ разработан для того, чтобы применить преимущества параллелизации.PLINQ is designed to exploit opportunities for parallelization. Но не все запросы станут быстрее при параллельном выполнении.However, not all queries benefit from parallel execution. Например, если запрос содержит только один пользовательский делегат с небольшим числом задач, последовательно запрос выполняется быстрее.For example, when a query contains a single user delegate that does very little work, the query will usually run faster sequentially. Это связано с тем, что накладные расходы на управление параллельным выполнением превышают полученную выгоду от ускорения работы.This is because the overhead involved in enabling parallelizing execution is more expensive than the speedup that is obtained. По этой причине PLINQ не применяет параллелизацию к каждому запросу автоматически.Therefore, PLINQ does not automatically parallelize every query. Сначала он проверяет форму запроса и входящие в него операторы.It first examines the shape of the query and the various operators that comprise it. Исходя из этих результатов анализа, PLINQ в стандартном режиме выполнения самостоятельно решает, нужно ли выполнять параллельно весь запрос или некоторые его элементы.Based on this analysis, PLINQ in the default execution mode may decide to execute some or all of the query sequentially. Но в некоторых случаях у вас есть больше сведений о запросе, чем доступно PLINQ на основе такого анализа.However, in some cases you may know more about your query than PLINQ is able to determine from its analysis. Например, вы знаете, что делегат весьма затратный и в любом случае выиграет от применения параллелизации.For example, you may know that a delegate is very expensive, and that the query will definitely benefit from parallelization. В таких случаях вы можете применить метод WithExecutionMode со значением ForceParallelism, чтобы PLINQ всегда выполнял этот запрос параллельно.In such cases, you can use the WithExecutionMode method and specify the ForceParallelism value to instruct PLINQ to always run the query as parallel.

Компиляция кодаCompiling the Code

Скопируйте и вставьте этот код в пример данных PLINQ, затем вызовите этот метод из Main.Cut and paste this code into the PLINQ Data Sample and call the method from Main.

См. такжеSee also