【发布时间】:2018-01-23 20:03:05
【问题描述】:
有什么方法可以从 PLINQ 的 SELECT 块中分离出来?根据 SELECT 块中的条件,我想打破循环。到目前为止,我看到了各种使用取消令牌从循环外部中断 PLINQ 的示例。但是,我的问题是从循环内部中断。
这是我的代码:
var simulationResults =
Enumerable.Range(0, 10000)
.AsParallel()
.WithCancellation(token ?? CancellationToken.None)
.Select(z =>
{
progressAction?.Invoke();
double aResult = someMethod()
if (double.IsNaN(aResult))
{
// todo: Find a way to Break the Parallel loop.
}
return aResult;
});
如果没有可用的技术,也许我需要找到一个困难的方法,比如使用带有 volatile 关键字的布尔标志。我将在 PLINQ Select 块中使用 lock 语句设置该标志,然后下一次,它将读取该标志并确定它是否应该中断。但是,不确定这是否是一个好的解决方案。此外,我非常不愿意在 PLINQ 内部使用锁,这会违背并行计算的目的。使用 Lock,我可能会强制执行同步,而无法获得并行编程的好处。
所以有更好的主意吗?
【问题讨论】:
-
可以在
Select之后添加.TakeWhile(result => !double.IsNaN(result))?