Porady: określanie trybu wykonywania w PLINQ

W tym przykładzie pokazano, jak wymusić, aby PLINQ pominąć jego domyślne heurystyki i zrównoleglić zapytanie niezależnie od kształtu zapytania.

Uwaga

Ten przykład ma na celu zademonstrowanie użycia i może nie działać szybciej niż równoważne sekwencyjne zapytanie LINQ to Objects. Aby uzyskać więcej informacji na temat przyspieszania, zobacz Understanding Speedup in PLINQ (Opis szybkości w PLINQ).

Przykład

// 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 jest przeznaczony do wykorzystania możliwości równoległego przetwarzania. Jednak nie wszystkie zapytania korzystają z równoległego wykonywania. Na przykład jeśli zapytanie zawiera pojedynczego delegata użytkownika, który wykonuje niewielką pracę, zapytanie zwykle będzie działać szybciej sekwencyjnie. Wykonywanie sekwencyjne jest szybsze, ponieważ obciążenie związane z włączaniem równoległego wykonywania jest droższe niż uzyskane przyspieszenie. W związku z tym PLINQ nie wykonuje automatycznego równoległości każdego zapytania. Najpierw analizuje kształt zapytania i różne operatory, które go tworzą. Na podstawie tej analizy funkcja PLINQ w domyślnym trybie wykonywania może zdecydować się wykonać część lub wszystkie zapytanie sekwencyjnie. Jednak w niektórych przypadkach możesz wiedzieć więcej o zapytaniu niż PLINQ jest w stanie określić na podstawie analizy. Na przykład możesz wiedzieć, że delegat jest kosztowny i że zapytanie na pewno skorzysta z równoległego przetwarzania. W takich przypadkach można użyć WithExecutionMode metody i określić ForceParallelism wartość, aby poinstruować PLINQ, aby zawsze uruchamiać zapytanie jako równoległe.

Kompilowanie kodu

Wyciąć i wkleić ten kod do przykładu danych PLINQ i wywołać metodę z Mainklasy .

Zobacz też