После cancelTokenSource.Cancel() , Task остается в состоянии RanToCompletion

221
20 сентября 2017, 09:36

Пытаюсь правильно прервать выполнение функции через token, однако task остается всегда в состоянии RanToCompletion. Подскажите пожалуйста, в чем проблема?

CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
    CancellationToken token = cancelTokenSource.Token;
    int number = 6;
    Task task1 = new Task(() =>
    {
        int result = 1;
        for (int i = 1; i <= number; i++)
        {
            if (token.IsCancellationRequested)
            {
                return;
            }
            result *= i;
            Thread.Sleep(5000);
            cancelTokenSource.Cancel();
        }
    },cancelTokenSource.Token);
    task1.Start();
    task1.Wait();
    Console.WriteLine(Convert.ToString(task1.Status));
Answer 1

Если точнее, то это делает так:

CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
            CancellationToken token = cancelTokenSource.Token;
            int number = 6;
            Task task1 = new Task(() =>
            {
                int result = 1;
                for (int i = 1; i <= number; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        token.ThrowIfCancellationRequested();
                    }
                    result *= i;
                    Thread.Sleep(5000);
                    cancelTokenSource.Cancel();
                }
            }, cancelTokenSource.Token);
            task1.Start();
            try
            {
                task1.Wait();
                Console.WriteLine(Convert.ToString(task1.Status));
            }
            catch
            {
                Console.WriteLine(Convert.ToString(task1.Status));
            }
Answer 2

Для того, чтобы таск перешёл в состояние Cancelled, вам необходимо не мягко опросить токен и выйти, а жёстко бросить исключение. Замените

if (token.IsCancellationRequested)
{
    return;
}

на

token.ThrowIfCancellationRequested();

Исключение будет доставлено в task1.Wait(), так что вам понадобится ещё try/catch.

READ ALSO
Выполнение кода в блоке try/catch

Выполнение кода в блоке try/catch

Есть группа методов, выполняемых асинхронноЗапуск метода на исполнение выполняется следующим образом

215
Чтение содержимого сайта [дубликат]

Чтение содержимого сайта [дубликат]

На данный вопрос уже ответили:

247
IO.FileSystemWatcher HDD просыпается по непонятной причине

IO.FileSystemWatcher HDD просыпается по непонятной причине

Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...

215