Cancelar una tarea arroja una excepción
De lo que he leído sobre Tareas, el siguiente código debería cancelar la tarea que se está ejecutando actualmente sin lanzar una excepción. Tenía la impresión de que el objetivo de la cancelación de la tarea era "pedir" cortésmente que la tarea se detuviera sin abortar los hilos.
La salida del siguiente programa es:
Excepción de descarga
[OperationCanceledException]
Cancelar y devolver la última prima calculada.
Estoy tratando de evitar cualquier excepción al cancelar. ¿Cómo puedo lograr esto
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;
}