并行。Foreach c#暂停和停止功能?

并行。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的方法

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又占用互联网连接的程序,可以很快填满它,所以暂停可能不会那么糟糕。我将实现停止功能,并将未完成元素的列表保存到另一个列表中,然后在下一次运行时重写该列表。然后从停止的地方继续。有点像停顿。谢谢。如果其中一个答案给了你一个解决方案。