Я тестирую простое консольное приложение, созданное на Linqpad, идея заключается в том, чтобы обеспечить понимание работы Task
и создать логику, которая работает, когда Task
is завершен, сбой или отменен. Я хочу выполнить логику только тогда, когда Task будет завершена, но не будет отменена или отменена.Почему Task не отображает отмененный статус
void Main()
{
CancellationTokenSource cts = new CancellationTokenSource(new TimeSpan(0,0,0,0,1000));
Task t = Task.Run(() => Work(),cts.Token);
try
{
t.Wait();
}
catch
{
}
("Completed :: " + t.IsCompleted).Dump();
("Canceled :: " + t.IsCanceled).Dump();
("Faulted :: " + t.IsFaulted).Dump();
}
public async Task Work()
{
await Task.Delay(3000);
}
Ниже приведены вопросы:
Я могу с уверенностью выяснить Заполненный и FAULTED состояния, но даже тогда, когда на мой взгляд, этот код должен привести к отмене задач, значение
IsCanceled
свойство всегда ложно.В идеале, когда задача нарушенные, хотя я молча захватывая исключение в попытке поймать блок, он должен показать
IsCompleted
как ложный, но всегда остается в силе, в настоящее время LINQPad не продолжать вариант ошибки, но я предполагаю, что было бы превратить ложь, если я могу продолжить на ошибки
Отмена * кооператив *. Ваша задача проигнорировала ваш токен отмены и вместо этого остановилась. Поэтому он не был отменен. –
Какую модификацию я должен сделать, чтобы заставить это работать, и является ли мое другое понимание правильным, если оно распространяется, тогда оно должно быть ошибочно не завершено? –