.net loopstate.Break()、loopstate.Stop()和CancellationTokenSource.Cancel()之间的区别是什么
我有一个简单的问题,我有以下简单的并行for循环。此for循环是windows服务的一部分。当有人停止服务时,我想停止循环。我可以找到三种方法来停止并行,这是在if条件下。停止并行for循环的最佳方法是什么?有什么区别.net loopstate.Break()、loopstate.Stop()和CancellationTokenSource.Cancel()之间的区别是什么,.net,windows,c#-4.0,for-loop,parallel-processing,.net,Windows,C# 4.0,For Loop,Parallel Processing,我有一个简单的问题,我有以下简单的并行for循环。此for循环是windows服务的一部分。当有人停止服务时,我想停止循环。我可以找到三种方法来停止并行,这是在if条件下。停止并行for循环的最佳方法是什么?有什么区别 CancellationTokenSource cancellationToken = new CancellationTokenSource(); ParallelOptions options = new ParallelOptions();
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();
}
}
});
CancellationToken
用于信号取消
loopState.Break()
和loopState.Stop()
用于结束执行
这里有一个例子
Parallel.For(0, maximum_operations, options, (a, 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()
表示在当前线程上的当前迭代之前,在所有线程上完成所有迭代,然后退出循环()
loopState.Stop()
表示尽快停止所有迭代()
另一种终止执行的方法是call token.ThrowIfCancellationRequested(),但您需要处理
OperationCanceledException
异常:
public void MyMethod()
{
try
{
Parallel.For(0, maximum_operations, options, (a, loopState) =>
{
// do work
token.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException)
{
// handle cancellation
}
}
所有这些方法都是终止执行Parallel.For
的有效方法。您使用哪一种取决于您的需求
例如:
- 当windows服务停止时,是否必须立即停止所有执行?然后可以使用
token.ThrowIfCancellationRequested()
- 循环是否处理需要清理的IDisposable对象?然后可以使用
或loopState.Break()
loopState.Stop()
一些供参考的文章: