Ошибка в отмене задачи (Task) - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток) На данный момент изучаю многопоточность, а именно отмена выполнения задач (Task). Так вот, есть пример, по которому я пытаюсь освоить этот инструмент работы с задачами,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
 
namespace PTAsk_Cancel
{
 
    class Program
    {
        static void MyTask(Object ob)
        {
            CancellationToken cantok = (CancellationToken) ob;
            // Проверить, отменена ли задача, прежде чем запускать ее
            cantok.ThrowIfCancellationRequested();
            Console.WriteLine("Mytask() was started");
            for(int i = 0; i<10; i++){
                // проводится опрос для отслеживания отмены
                if (cantok.IsCancellationRequested)
                {
                    Console.WriteLine("Will provide a request to cancel the task");
                    cantok.ThrowIfCancellationRequested();
                }
                Thread.Sleep(500);
                Console.WriteLine("Count = " + i);
            }
            Console.WriteLine("Mytask() was complited");
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Main thread was started");
            // Создать объект источника признаков отмены
            CancellationTokenSource cs = new CancellationTokenSource();
            // Запустить задачу, передав признак отмены ей самой и делегату
            Task ts = Task.Factory.StartNew(MyTask, cs.Token, cs.Token);
            // Дать возможность задаче выполняться на протяжении 2 сек
            Thread.Sleep(2000);
            try
            {
                //отменить задачу
                cs.Cancel();
                // Приостановить выполнение метода Main() до тех пор,
                // пока не завершится задача tsk.
                ts.Wait();
            }
            catch (Exception  exc)
            {
                if (ts.IsCanceled)
                {
                    Console.WriteLine("Task was canceled");
                    Console.WriteLine(exc);
                }
            }
            finally
            {
                ts.Dispose();
                cs.Dispose();
            }
            Console.WriteLine("Main thread was complition");
            Console.ReadKey();
        }
    }
}
но компилятор ругается на строку
cantok.ThrowIfCancellationRequested();
- Исключение типа "System.OperationCanceledException" возникло в mscorlib.dll, но не было обработано в коде пользователя. Подскажите, пожалуйста, как с этим бороться. Заранее благодарен!

Решение задачи: «Ошибка в отмене задачи (Task)»

textual
Листинг программы
 System.Threading.CancellationTokenSource can = new System.Threading.CancellationTokenSource(3000);
            var f = new TaskFactory<int>(can.Token);
            f.StartNew(() =>
               {
                   for (int i = 0; !f.CancellationToken.IsCancellationRequested && i < 100; i++)
                   {
                       System.Threading.Thread.Sleep(1000);
                       Console.Write(i);
                   }
                   return 0;
               });

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5