java parrallel for_Parallel.Foreach c#暂停和停止功能?

Damien_The_Unbeliver有一个很好的方法,但是仅当您想让某个外部进程停止循环时才这样做。如果希望像在普通break或for循环中使用foreach一样使循环中断,则需要使用具有a overload的ParallelLoopState作为循环主体的参数之一。 ParallelLoopState具有与您要执行的操作相关的两个功能,即ParallelLoopState和Stop()。

函数Stop()将停止处理元素在系统最早的时候,这意味着在调用Stop()之后可以执行更多的迭代,并且不能保证在您停止的元素之前的元素具有甚至开始处理。

Break()函数的功能与Break()完全相同,但是它还将评估在您调用了Stop()的项目之前的Break()的所有元素。当您不关心元素的处理顺序时,这很有用,但是您必须处理所有元素直到停止为止。

检查从foreach返回的Stop(),以查看foreach是否提前停止,如果使用了IEnumerable,则它处理的编号最小的项目是什么。

Break()

这是一个更实际的例子

ParallelLoopResult

无论如何拆分工作,它总是会返回2作为答案。

比方说,处理器分派了两个线程进行处理,第一个线程处理元素0-2,第二个线程处理元素3-5。

线程1:线程20,否,继续下一个3,否,继续下一个1,假,继续下一个4,真,休息2,正确,突破5,不要处理破碎

现在调用最低索引Break的是2,因此Break()每次都会返回2,线程的分解方法无所谓,因为它将始终处理到2。]

这里是如何使用Stop的示例。

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;

}

}

根据其拆分工作的方式,将返回2或4作为答案。

比方说,处理器分派了两个线程进行处理,第一个线程处理元素0-2,第二个线程处理元素3-5。

线程1:线程20,否,继续下一个3,否,继续下一个1,假,继续下一个4,真,停止2,不处理,已停止5,不处理,已停止

在这种情况下,它将返回4作为答案。让我们看一下相同的过程,但是如果它处理所有其他元素而不是0-2和3-5。

线程1:线程20,否,继续下一个1,False,继续下一个2,正确,停止3,错误,继续下一个4,不处理,已停止5,不处理,已停止

这次将返回2而不是4。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值