并行。Foreach c#暂停和停止功能?
什么是最有效的暂停和停止(在结束前)parallel.foreach的方法并行。Foreach c#暂停和停止功能?,c#,parallel-processing,parallel.foreach,C#,Parallel Processing,Parallel.foreach,什么是最有效的暂停和停止(在结束前)parallel.foreach的方法 Parallel.ForEach(list, (item) => { doStuff(item); }); 为了能够停止Parallel.ForEach,您可以使用一个接受参数的重载,并在这些选项中包含一个 有关更多详细信息,请参阅 至于暂停,我想不出你为什么总的来说想这么做。您可能正在寻找a(用于协调多个线程之间的工作,比如说,如果它们都需要先完成a部分,然后再继续执行B部分),但我不认为您会将其与Pa
Parallel.ForEach(list, (item) =>
{
doStuff(item);
});
为了能够停止Parallel.ForEach,您可以使用一个接受参数的重载,并在这些选项中包含一个 有关更多详细信息,请参阅 至于暂停,我想不出你为什么总的来说想这么做。您可能正在寻找a(用于协调多个线程之间的工作,比如说,如果它们都需要先完成a部分,然后再继续执行B部分),但我不认为您会将其与
Parallel.ForEach
,因为您不知道将有多少参与者。有一个很好的方法,但这只是当你想让一些外部进程停止循环时。如果您希望像在正常的for
或foreach
循环中使用中断
一样中断循环,则需要使用具有作为循环体参数之一的ParallelLoopState
有两个与您要执行的操作相关的函数,以及
函数Stop()
将在系统最早方便时停止处理元素,这意味着调用Stop()后可以执行更多的迭代,并且不能保证在您停止的元素之前出现的元素甚至已经开始处理
函数Break()
执行的操作与Stop()
完全相同,但是它也会计算IEnumerable
中在您调用Break()
的项之前的所有元素。当您不关心元素的处理顺序,但必须处理所有元素直到停止时,这非常有用
检查foreach返回的项目,查看foreach是否提前停止,如果使用了Break()
,它处理的编号最低的项目是什么
Parallel.ForEach(list, (item, loopState) =>
{
bool endEarly = doStuff(item);
if(endEarly)
{
loopState.Break();
}
}
);
//Equivalent to the following non parallel version, except that if doStuff ends early
// it may or may not processed some items in the list after the break.
foreach(var item in list)
{
bool endEarly = doStuff(item);
if(endEarly)
{
break;
}
}
这里有一个更实际的例子
static bool[] list = new int[]{false, false, true, false, true, false};
long LowestElementTrue()
{
ParallelLoopResult result = Parallel.ForEach(list, (element, loopState) =>
{
if(element)
loopState.Break();
}
if(result.LowestBreakIteration.IsNull)
return -1;
else
return result.LowestBreakIteration.Value;
}
不管它如何分解工作,它总是返回2作为答案
假设处理器分派两个线程来处理这个问题,第一个线程处理元素0-2,第二个线程处理元素3-5
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Break
2, True, Break 5, Don't process Broke
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Stop
2, Don't process, Stopped 5, Don't process, Stopped
根据它如何分割工作,它将返回2或4作为答案
假设处理器分派两个线程来处理这个问题,第一个线程处理元素0-2,第二个线程处理元素3-5
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Break
2, True, Break 5, Don't process Broke
Thread 1: Thread 2
0, False, continue next 3, False, continue next
1, False, continue next 4, True, Stop
2, Don't process, Stopped 5, Don't process, Stopped
线程1:线程2
0,False,继续下一步3,False,继续下一步
1,错误,继续下一步4,正确,停止
2,不处理,停止5,不处理,停止
在这种情况下,它将返回4作为答案。让我们看看相同的过程,但如果它处理其他元素,而不是0-2和3-5
Thread 1: Thread 2
0, False, continue next 1, False, continue next
2, True, Stop 3, False, continue next
4, Don't process, Stopped 5, Don't process, Stopped
线程1:线程2
0,False,继续下一步1,False,继续下一步
2,正确,停止3,错误,继续下一步
4,不处理,停止5,不处理,停止
这次它将返回2而不是4。暂停?为什么要暂停?当然,如果可能的话,暂停只是我想添加的一个额外功能。我正在写一个既占用cpu又占用互联网连接的程序,可以很快填满它,所以暂停可能不会那么糟糕。我将实现停止功能,并将未完成元素的列表保存到另一个列表中,然后在下一次运行时重写该列表。然后从停止的地方继续。有点像停顿。谢谢。如果其中一个答案给了你一个解决方案。