Ошибка в отмене задачи (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;
});