從我讀過的關於任務的內容中,下面的代碼應該取消當前正在執行的任務而不會引發異常。我的印象是,取消任務的全部任務是禮貌地「要求」任務停止而不中止線程。取消任務引發異常
從下面的程序的輸出是:
傾銷例外
[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;
}
如果您嘗試避免異常,則不應使用ThrowIfCancellationRequested引發異常。只需從CalculatePrime中優雅地返回即可。 –
我已經刪除了cancelToken.ThrowIfCancellationRequested();我仍然得到相同的結果。 –
不要將取消令牌傳遞給Task.wait,因爲您已請求取消該任務。改爲調用Task.wait()。 –