【发布时间】:2011-12-07 15:53:37
【问题描述】:
如何限制 AsParallel() 预先读取并放入其内部缓冲区的项目数量?
这是一个例子:
int returnedCounter;
IEnumerable<int> Enum()
{
while (true)
yield return Interlocked.Increment(ref returnedCounter);
}
[TestMethod]
public void TestMethod1()
{
foreach (var i in Enum().AsParallel().Select(a => a))
{
Thread.Sleep(3000);
break;
}
Console.WriteLine(returnedCounter);
}
我消耗了 1 个项目,睡眠,停止枚举。它在我的机器上打印 526400。在我的真实项目中,每个项目分配数千字节。 AsParallel() 会预先读取大量项目,这会导致非常糟糕的内存消耗和 CPU 浪费。
Put WithMergeOptions(ParallelMergeOptions.NotBuffered) 有点帮助。它打印 4544。但对我来说仍然太多了。
在 Enum() 中等待会冻结主线程中的循环。
【问题讨论】:
标签: .net multithreading plinq