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 Main
klasy .