Ошибка в отмене задачи (Task) - C#
Формулировка задачи:
Доброго времени суток) На данный момент изучаю многопоточность, а именно отмена выполнения задач (Task).
Так вот, есть пример, по которому я пытаюсь освоить этот инструмент работы с задачами,
но компилятор ругается на строку - Исключение типа "System.OperationCanceledException" возникло в mscorlib.dll, но не было обработано в коде пользователя.
Подскажите, пожалуйста, как с этим бороться. Заранее благодарен!
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();
Решение задачи: «Ошибка в отмене задачи (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; });
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д