Это связано с тем, что статус «Задание» устанавливается на «Отменено» только при выходе с данным типом исключения, в противном случае, если вы просто «вернетесь» из него, его статус будет установлен на RanToCompletion. И, следовательно, фрагмент кода OnlyOnCanceled не вызывается.
го, что я прочитал о Задачах, следующий код должен отменить текущую задачу без исключения. У меня сложилось впечатление, что весь смысл отмены задачи состоял в том, чтобы вежливо «попросить» задачу остановиться без прерывания потоков.
Вывод из следующей программы:
Демпинг исключения
[OperationCanceledException]
Отмена и возврат последнего рассчитанного простого числа.
Я пытаюсь избежать любых исключений при отмене. Как я могу сделать это?
void Main()
{
var cancellationToken = new CancellationTokenSource();
var task = new Task<int>(() => {
return CalculatePrime(cancellationToken.Token, 10000);
}, cancellationToken.Token);
try
{
task.Start();
Thread.Sleep(100);
cancellationToken.Cancel();
task.Wait(cancellationToken.Token);
}
catch (Exception e)
{
Console.WriteLine("Dumping exception");
e.Dump();
}
}
int CalculatePrime(CancellationToken cancelToken, object digits)
{
int factor;
int lastPrime = 0;
int c = (int)digits;
for (int num = 2; num < c; num++)
{
bool isprime = true;
factor = 0;
if (cancelToken.IsCancellationRequested)
{
Console.WriteLine ("Cancelling and returning last calculated prime.");
//cancelToken.ThrowIfCancellationRequested();
return lastPrime;
}
// see if num is evenly divisible
for (int i = 2; i <= num/2; i++)
{
if ((num % i) == 0)
{
// num is evenly divisible -- not prime
isprime = false;
factor = i;
}
}
if (isprime)
{
lastPrime = num;
}
}
return lastPrime;
}