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

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

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。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35630.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注