使用方法使用CancellationToken取消Parallel.For

时间:2018-12-01 13:12:50

标签: c# cancellationtokensource cancellation-token parallel.for

使用功能时,我需要取消Parallel.For的所有任务。 例如:

class Example
{
    private CancellationTokenSource cts;
    public Example()
    {
        cts = new CancellationTokenSource();
    }
    public void plsCompute()
    {
        ParallelOptions po = new ParallelOptions{ CancellationToken = cts.Token };
        Parallel.For(0, 10, po, (i) => compute());
    }

    public void plsStopComputing()
    {
        cts.Cancel();
    }

    public void compute()
    {
        for(int i=0;i<100000;i++){
            if(//token was cancelled){
                Console.WriteLine("Cancelled");
                return;
            }
            //do something
        }
    }

我需要停止当前正在运行的所有任务,而不是创建新任务。

有什么办法可以做到这一点?

我看到的所有示例都是使用lambda中的函数编写的,因此可以访问cts。我需要其他功能。另外,如果我将令牌作为参数传递,则它不起作用。 cts令牌已更改,但在其他线程中未更改。

任何需要帮助的人:)

编辑

正如我在评论中提到的那样,我更加深入,这个例子并不是我真正想要的。这些方法由wpf应用程序通过msmq发送的消息调用。我认为每次我从wpf调用时,service都会创建此类的新实例,因此它将取消新实例,而不是已经在计算的实例。 有没有办法调用同一实例?

1 个答案:

答案 0 :(得分:0)

问题在于msmq调用,每次收到消息时,都会创建一个新的class实例。 我已经解决了

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

在实现服务的类的声明之上