Пытаюсь правильно прервать выполнение функции через token, однако task остается всегда в состоянии RanToCompletion. Подскажите пожалуйста, в чем проблема?
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
CancellationToken token = cancelTokenSource.Token;
int number = 6;
Task task1 = new Task(() =>
{
int result = 1;
for (int i = 1; i <= number; i++)
{
if (token.IsCancellationRequested)
{
return;
}
result *= i;
Thread.Sleep(5000);
cancelTokenSource.Cancel();
}
},cancelTokenSource.Token);
task1.Start();
task1.Wait();
Console.WriteLine(Convert.ToString(task1.Status));
Если точнее, то это делает так:
CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
CancellationToken token = cancelTokenSource.Token;
int number = 6;
Task task1 = new Task(() =>
{
int result = 1;
for (int i = 1; i <= number; i++)
{
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
result *= i;
Thread.Sleep(5000);
cancelTokenSource.Cancel();
}
}, cancelTokenSource.Token);
task1.Start();
try
{
task1.Wait();
Console.WriteLine(Convert.ToString(task1.Status));
}
catch
{
Console.WriteLine(Convert.ToString(task1.Status));
}
Для того, чтобы таск перешёл в состояние Cancelled
, вам необходимо не мягко опросить токен и выйти, а жёстко бросить исключение. Замените
if (token.IsCancellationRequested)
{
return;
}
на
token.ThrowIfCancellationRequested();
Исключение будет доставлено в task1.Wait()
, так что вам понадобится ещё try/catch.
Есть группа методов, выполняемых асинхронноЗапуск метода на исполнение выполняется следующим образом
Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...