微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

loopState.Break,loopState.Stop和CancellationTokenSource.Cancel之间有什么区别?

我有一个简单的问题,我有以下简单的并行for循环。 这for循环是Windows服务的一部分。 当有人停止服务时,我想停止循环。 我可以find三种方法来停止并行,这是如果条件。 什么是停止并行循环的最好方法,有什么区别?

CancellationTokenSource cancellationToken = new CancellationTokenSource(); ParallelOptions options = new ParallelOptions(); options.CancellationToken = cancellationToken.Token; Parallel.For(0,maximum_operations,options,(a,loopState) => { { //Do something if(!KeepProcessing) { //loopState.Break(); //loopState.Stop(); cancellationToken.Cancel(); } } });

在Windows Vista> 8上获取用户帐户configuration文件图片

Windows / .NET负载分配和平衡

以编程方式更改Internet Explorer设置?

在哪里得到.net的Apache poi端口

限制在MS脚本引擎中使用名称空间

CancellationToken用于表示取消

loopState.Break()和loopState.Stop()用于结束执行

这是一个例子

Parallel.For(0,loopState) => { // do work // cancellationToken.Cancel() should be called externally if(token.IsCancellationRequested) { // cancellation requested - perform cleanup work if necessary // then call loopState.Break(); // or loopState.Stop(); } });

loopState.Break()表示完成当前线程上当前迭代之前的所有线程上的所有迭代,然后退出循环( MSDN )。

loopState.Stop()意味着尽快停止所有迭代( MSDN )。

另一种终止执行的方法调用token.ThrowIfCancellationRequested(),但是您将需要处理OperationCanceledException异常:

public void MyMethod() { try { Parallel.For(0,loopState) => { // do work token.ThrowIfCancellationRequested(); }); } catch (OperationCanceledException) { // handle cancellation } }

所有这些方法都是终止Parallel.For执行的有效方法。 你使用哪一个取决于你的要求。

例如:

当您的Windows服务停止时立即停止所有执行是必不可少的? 那么你可以使用token.ThrowIfCancellationRequested()

您的循环是否处理需要清理的Idisposable对象? 那么你可以使用loopState.Break()或loopState.Stop()

一些文章供参考:

MSDN:取消

MSDN:如何:停止或从一个Parallel.For循环中断

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐