实现并行无限循环的最佳方法是什么?

red*_*alx 9 .net c# parallel-processing parallel-extensions parallel-for

我已经习惯在.Net的并行扩展中使用Parallel.For(),因为它是一种简单的并行化代码的方法,而无需手动启动和维护线程(这可能是繁琐的).我现在正在看一个无限循环(做一些事情,直到我发出信号停止),我希望并行化,没有一个参数可以自由Parallel.For()重载这样做,所以想知道这里最好的方法是什么是.原则上我可以这样做:

Parallel.For(0, int.Max)
Run Code Online (Sandbox Code Playgroud)

但我怀疑这可能不是工作分区逻辑处理的预期/有效模式(?)

另一种选择是:

for(;;)
{
    Parallel.For(0, 128, delegate()
    {
       // Do stuff.
    }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不够优雅,也可能导致低效的工作分区.

现在我的直觉是通过创建和维护我自己的线程来手动执行此操作,但我有兴趣获得一些反馈/意见.谢谢.

===更新===

我在接受的答案中使用了文章中的代码的简化版本(我删除了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; 
    }
}
Run Code Online (Sandbox Code Playgroud)

一个示例用法是:

Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
    // Do stuff.


});
Run Code Online (Sandbox Code Playgroud)

Ryn*_*ant 8

Stephen Toub有一篇关于使用Parallel.ForEach实现并行的文章.

  • 对于像我这样的菜鸟来说,Stephen Toub的帖子非常先进.很好地理解最佳/推荐方法的简单示例用法. (2认同)

Hen*_*man 1

如果你(真的)想要无限的东西,那么你希望它在尽可能少的核心上。没有一个Parallel.For___是好的选择。

您(可能)需要的是使用 LongRunning 选项创建的单独线程或任务。

然后让它等待信号量,或者作为最后的手段尽可能频繁地调用 Sleep()。

  • @locster - 有一个主“无限”线程,可以为其工作创建子线程。 (4认同)
  • 这个问题的背景是它是一个数据挖掘项目。我正在获取当前无限期运行的数据分析代码(例如,运行一整夜,然后发出信号让它在第二天早上停止)并将其分配给多个线程,因此我确实希望它在所有核心上无限期地运行。 (2认同)