отмена асинхронной функции C # - PullRequest
0 голосов
/ 03 марта 2019

У меня есть следующая программа:

class myClass
{
    CancellationTokenSource cts;

    public string someMethod(){
        someMethodWhichIsAsync("10")
    }

    private async Task<string> someMethodWhichIsAsync(string data)
    {
        if(cts != null)
        {
            cts.Cancel();
        }

        cts = new CancellationTokenSource();

        string myString = await Task.Run(() => someLoop(data,cts.Token) );

        return "success";
    }

    private string someLoop(string data, CancellationToken token)
    {

            while (True)
            {
                if (token.IsCancellationRequested == true)
                {
                    return "Canceled";
                }

                //Do some work in a continuous loop

            }

            return "successful end";

    }
}

Я разместил CancellationTokenSource cts;в глобальной области видимости класса, чтобы она была доступна при каждом запуске любой функции.

Однако cts.Cancel ();работает, только если я включаю его в функцию, которая выполняется.

        if (token.IsCancellationRequested == true)
        {
            return "Canceled";
        }

Почему это так? Ни один из примеров кода, который я нашел, не требует этого.

1 Ответ

0 голосов
/ 03 марта 2019

Ну, как я вижу из документации, CancellationTokenSource.Cancel только посылает СИГНАЛ, что процесс должен быть отменен.Затем с помощью токена источника вы проверяете, было ли запрошено аннулирование (которое имеет значение True, только если вы ранее вызывали метод Cancel).Таким образом, эта строка необходима для фактической отмены операции.

...