中止Parallel.Foreach

时间:2015-03-20 13:15:21

标签: c# .net foreach parallel-processing parallel.foreach

我使用Parallel.ForEach来实现并行性,我想知道有任何方法可以在任何请求完成后停止执行Parallel.ForEach。例如,请考虑以下代码:

IEnumerable<string> myList = new List<string>() { "admin", "admin2", "admin3" };
CancellationTokenSource _tokenSource = new CancellationTokenSource();

Parallel.ForEach(myList,
    admin_name =>
    {
        Console.WriteLine(admin_name);
    });

以上代码打印adminadmin2admin3。如果打印任何管理员名称,我想停止进一步执行。

这可以实现吗?或者有可用的工作吗?

我愿意接受建议和改进。

1 个答案:

答案 0 :(得分:1)

有一个Parallel.ForEach的重载,它将ParallelLoopState传递给你的委托,这可以用来突破Parallel.ForEach,即:

Parallel.ForEach(myList, (admin_name, state) => 
{
    Console.WriteLine(admin_name);

    // Stop other iterations
    state.Stop();
});

您需要记住的是,这不是原子的,已经启动的其他代表将继续执行,除非他们明确检查state.IsStopped

而不是ParallelLoopState.Stop()您可能需要ParallelLoopState.Break()

有关Stop()Break()的更多信息,请访问How to: Stop or Break from a Parallel.For Loop