Статус задачи «Ошибка» и «Отменено» после CancellationToken.ThrowIfCancellationRequestedC#

Место общения программистов C#
Ответить
Anonymous
 Статус задачи «Ошибка» и «Отменено» после CancellationToken.ThrowIfCancellationRequested

Сообщение Anonymous »

Обычно я не публикую вопрос с ответом, но на этот раз я хотел бы привлечь внимание к тому, что, по моему мнению, может быть неясной, но распространенной проблемой. Это было вызвано этим вопросом, поскольку затем я просмотрел свой старый код и обнаружил, что на некоторые его части это тоже повлияло.

Приведенный ниже код запускается и ожидает двух задач , 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»