Приведенный ниже код запускается и ожидает двух задач , Task1 и Task2, которые практически идентичны. Задача 1 отличается от задачи 2 только тем, что она выполняет бесконечный цикл. ИМХО, оба случая вполне типичны для некоторых реальных сценариев выполнения работы, связанной с процессором.
Код: Выделить всё
using System;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
public class Program
{
static async Task TestAsync()
{
var ct = new CancellationTokenSource(millisecondsDelay: 1000);
var token = ct.Token;
// start task1
var task1 = Task.Run(() =>
{
for (var i = 0; ; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// start task2
var task2 = Task.Run(() =>
{
for (var i = 0; i < 1000; i++)
{
Thread.Sleep(i); // simulate work item #i
token.ThrowIfCancellationRequested();
}
});
// await task1
try
{
await task1;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task1", ex.Message, task1.Status });
}
// await task2
try
{
await task2;
}
catch (Exception ex)
{
Console.WriteLine(new { task = "task2", ex.Message, task2.Status });
}
}
public static void Main(string[] args)
{
TestAsync().Wait();
Console.WriteLine("Enter to exit...");
Console.ReadLine();
}
}
}
{ Task = Task1, Message = Операция была отменена., Status = Отменена
{ Task = Task2, Message = Операция была отменена. Статус = Ошибка.
Почему статус задачи 1 Отменен, но статус задачи2 — «Ошибка»? Обратите внимание: в обоих случаях я не передаю токен в качестве второго параметра в Task.Run.
Подробнее здесь: https://stackoverflow.com/questions/243 ... ationreque
Мобильная версия