我做了一些實驗性的Plinq查詢,並且我不確定結果是否會被破壞。Plinq使用StringBuilder的聚合擴展
下面是3種不同的方法,它提供了相同的結果:
// unitTask is typeof Task<List<SomeEntity>>
//sequential version PLINQ
Console.WriteLine(unitTask.Result.Take(10)
.Aggregate(new StringBuilder(),
(text, current) => text.AppendFormat("@{0}sa{1}",
current.FullName.Substring(0, 3),
current.FullName.Substring(4)))
.ToString());
//parallel version PLINQ
Console.WriteLine(unitTask.Result.Take(10).AsParallel()
.Aggregate(new StringBuilder(),
(text, current) => text.AppendFormat("@{0}sa{1}",
current.FullName.Substring(0, 3),
current.FullName.Substring(4)))
.ToString());
//parallel version foreach with Partitioner
var output = new StringBuilder();
Parallel.ForEach(Partitioner.Create(unitTask.Result.Take(10)), r =>
{
//Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
output.AppendFormat("@{0}sa{1}", r.FullName.Substring(0, 3),
r.FullName.Substring(4));
});
Console.WriteLine(output.ToString());
我的問題是:
我可以在PLINQ使用StringBuilder
? 由於我知道附加方法不是線程安全的。
或者它在這種情況下以順序模式運行?
Parallel.Foreach在不同的線程中運行查詢,但結果與順序Plinq相同。
它是偶然的,還是很聰明,並使用一些同步?
經過進一步的調查和測量,我得到了類似的結果(單線程和慢於純序列linq)。感謝您的確認,以及替代方案。 – speti43