我使用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
,admin2
和admin3
。如果打印任何管理员名称,我想停止进一步执行。
这可以实现吗?或者有可用的工作吗?
我愿意接受建议和改进。
答案 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。