1

使用函数时,我需要取消 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 令牌已更改,但在其他线程中它没有更改。

任何帮助appriciated :)

编辑

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

4

1 回答 1

0

问题在于通过 msmq 调用,每次收到消息时都会创建新的类实例。我已经解决了它添加

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

以上实现服务的类的声明

于 2018-12-02T17:28:54.443 回答