【问题标题】:Aborting Parallel.Foreach中止 Parallel.Foreach
【发布时间】:2015-03-20 13:15:20
【问题描述】:

我正在使用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);
    });

上面的代码打印admin,admin2admin3。如果打印了任何管理员名称,我想停止进一步执行。

这可以实现吗?或者有什么解决办法吗?

我愿意接受建议和改进。

【问题讨论】:

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


【解决方案1】:

Parallel.ForEach 的重载将ParallelLoopState 传递给您的委托,这可用于突破Parallel.ForEach,即:

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

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

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

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

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

【讨论】:

  • 能否请投反对票的人解释投反对票的原因,我会尽力纠正我犯的任何错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多