我已经习惯在 .Net 的并行扩展中使用 Parallel.For(),因为它是一种并行化代码的简单方法,无需手动启动和维护线程(这可能很繁琐)。我现在正在查看我希望并行化的无限循环(做某事直到我发出信号停止),没有一个参数免费的 Parallel.For() 重载可以做到这一点,所以想知道这里最好的方法是什么是。原则上我可以做类似的事情:
Parallel.For(0, int.Max)
但我怀疑这可能不是工作分区逻辑处理的预期/有效模式(?)
另一种选择是:
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
但这似乎不优雅,也可能导致工作划分效率低下。
现在我的直觉是通过创建和维护我自己的线程来手动执行此操作,但我有兴趣获得一些反馈/意见。谢谢。
=== 更新 ===
我在接受的答案中使用文章中代码的简化版本(我已删除 ParallelOptions 参数)。这是代码...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
一个示例用法是:
Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
// Do stuff.
});