【发布时间】:2013-12-09 11:23:48
【问题描述】:
我做了一些实验性的 Plinq 查询,但我不确定结果是否会损坏。
这里有 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 吗?
据我所知,由于 append 方法不是线程安全的。
或者在这种情况下它是否以顺序模式运行?
Parallel.Foreach 在不同线程中运行查询,但结果与顺序 Plinq 相同。
它是偶然的,还是它很聪明并且使用了一些同步?
【问题讨论】:
标签: c# stringbuilder plinq