- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Cancellation 操作与 loopState 操作(Break/Stop)之间有什么区别?
private static CancellationTokenSource cts;
public static loopingMethod()
{
cts = new CancellationTokenSource();
try
{
ParallelOptions pOptions = new ParallelOptions();
pOptions.MaxDegreeOfParallelism = 4;
pOptions.CancellationToken = cts.Token;
Parallel.ForEach(dictObj, pOptions, (KVP, loopState) =>
{
pOptions.CancellationToken.ThrowIfCancellationRequested();
parallelDoWork(KVP.Key, KVP.Value, loopState);
}); //End of Parallel.ForEach loop
}
catch (OperationCanceledException e)
{
//Catestrophic Failure
return -99;
}
}
public static void parallelDoWork(string Id, string Value, ParallelLoopState loopState)
{
try{
throw new exception("kill loop");
}
catch(exception ex)
{
if(ex.message == "kill loop")
{
cts.Cancel();
//Or do I use loopState here?
}
}
}
为什么我要使用 ParallelOptions Cancellation 操作而不是 loopState.Break();
或 loopState.Stop();
,反之亦然?
最佳答案
查看此 article
“设置取消 token 允许您中止 Invoke(请记住,当委托(delegate)抛出异常时,异常会被吞没,并且只有在所有其他委托(delegate)被已执行)。”
场景 1。假设您有一个用户要向所有前 [girl|boy] friend 发送消息。他们点击发送,然后他们意识到并想要取消它。通过使用取消 token ,他们能够阻止进一步的消息发出。因此,如果您有一个允许取消的长时间运行的流程,请使用取消 token 。
场景 2 另一方面,如果您不希望进程被中断,则使用正常的循环状态异常,以便在所有线程完成之前异常将被吞噬。
场景 3 如果您有一个 I/O 密集型进程,那么您可能希望使用 async/await 而不是 parallel.foreach。查看微软的 task-based asynchronous pattern .
关于c# - parallel.foreach - loopState.Stop() 与 Cancellation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16048260/
我有一个简单的问题,我有以下简单的并行 for 循环。这个 for 循环是 Windows 服务的一部分。当有人停止服务时,我想停止循环。我可以找到三种方法来停止并行 for,这是在 if 条件下。停
我正在尝试在 JSyn 中编写一个循环站程序,其灵感来自类似 this 的东西。 。我的想法是,我可以录制 Wav 文件并从程序中播放它们。在我尝试同时对多个文件执行此操作之前,这种方法效果很好。我该
Cancellation 操作与 loopState 操作(Break/Stop)之间有什么区别? private static CancellationTokenSource cts; public
我是一名优秀的程序员,十分优秀!