Vorgehensweise: Festlegen von Zusammenführungsoptionen in PLINQ
In diesem Beispiel wird gezeigt, wie Die Zusammenführungsoptionen angegeben werden, die für alle nachfolgenden Operatoren in einer PLINQ-Abfrage gelten. Sie müssen die Zusammenführungsoptionen nicht explizit festlegen, dies kann jedoch die Leistung verbessern. Weitere Informationen zu Zusammenführungsoptionen finden Sie unter Zusammenführungsoptionen in PLINQ.
Warnung
Dieses Beispiel soll die Verwendung veranschaulichen und kann nicht schneller als die entsprechende sequenzielle LINQ to Objects-Abfrage ausgeführt werden. Weitere Informationen zur Beschleunigung finden Sie unter Understanding Speedup in PLINQ.
Beispiel
Das folgende Beispiel veranschaulicht das Verhalten von Zusammenführungsoptionen in einem einfachen Szenario, das über eine nicht sortierte Quelle verfügt und eine teure Funktion auf jedes Element anwendet.
namespace MergeOptions
{
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading;
class Program
{
static void Main(string[] args)
{
var nums = Enumerable.Range(1, 10000);
// Replace NotBuffered with AutoBuffered
// or FullyBuffered to compare behavior.
var scanLines = from n in nums.AsParallel()
.WithMergeOptions(ParallelMergeOptions.NotBuffered)
where n % 2 == 0
select ExpensiveFunc(n);
Stopwatch sw = Stopwatch.StartNew();
foreach (var line in scanLines)
{
Console.WriteLine(line);
}
Console.WriteLine($"Elapsed time: {sw.ElapsedMilliseconds} ms. Press any key to exit.");
Console.ReadKey();
}
// A function that demonstrates what a fly
// sees when it watches television :-)
static string ExpensiveFunc(int i)
{
Thread.SpinWait(2000000);
return string.Format("{0} *****************************************", i);
}
}
}
Class MergeOptions2
Sub DoMergeOptions()
Dim nums = Enumerable.Range(1, 10000)
' Replace NotBuffered with AutoBuffered
' or FullyBuffered to compare behavior.
Dim scanLines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
Where n Mod 2 = 0
Select ExpensiveFunc(n)
Dim sw = Stopwatch.StartNew()
For Each line In scanLines
Console.WriteLine(line)
Next
Console.WriteLine("Elapsed time: {0} ms. Press any key to exit.")
Console.ReadKey()
End Sub
' A function that demonstrates what a fly
' sees when it watches television :-)
Function ExpensiveFunc(ByVal i As Integer) As String
Threading.Thread.SpinWait(2000000)
Return String.Format("{0} *****************************************", i)
End Function
End Class
In Fällen, in denen die AutoBuffered Option zu einer unerwünschten Latenz führt, bevor das erste Element zurückgegeben wird, versuchen Sie die NotBuffered Option, um Ergebniselemente schneller und reibungsloser bereitzustellen.