gpt4 book ai didi

c# - parallel.foreach - loopState.Stop() 与 Cancellation

转载 作者:太空狗 更新时间:2023-10-29 21:45:23 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com