Отмена Parallel.For с CancellationToken с использованием метода - PullRequest
0 голосов
/ 01 декабря 2018

Мне нужно отменить все задачи, выполненные 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
        }
    }

Мне нужно остановить все задачи, которые выполняются в данный момент, а не создавать новые.

Есть ли способ добиться этого?

Все примерыЯ видел, был с функцией, сделанной в лямбда, так что там я мог получить доступ к CTS.Мне нужно, чтобы это было в другой функции.Также, если я передал токен в качестве параметра, он не работал.токен cts был изменен, но в других потоках он не изменился.

Любая помощь appriciated:)

EDIT

Как я уже упоминал в комментарии, я получил более глубокий, этот пример недействительно то, что я хочу.Эти методы вызываются сообщениями, отправленными через msmq из приложения wpf.Я думаю, что каждый раз, когда я звоню из wpf, сервис создает новый экземпляр этого класса, поэтому он отменяет новый экземпляр вместо того, который уже вычисляется.Есть ли способ вызвать тот же экземпляр?

1 Ответ

0 голосов
/ 02 декабря 2018

Проблема была в том, что при вызове msmq каждый раз при получении сообщения создавался новый экземпляр класса.Я решил это, добавив

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

Выше объявления класса, который реализует службу

...