取消任务会引发异常

根据我对任务的了解,以下代码应取消当前正在执行的任务,而不会引发异常。我的印象是,任务取消的全部目的是礼貌地“要求”任务停止而不中断线程。

以下程序的输出是:

倾销例外

[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;

}

回答:

您在此行上明确抛出了异常:

cancelToken.ThrowIfCancellationRequested();

如果要正常退出任务,则只需摆脱该行。

通常,人们将其用作一种控制机制,以确保中止当前处理而不会潜在地运行任何额外的代码。同样,ThrowIfCancellationRequested()由于在功能上等同于:

if (token.IsCancellationRequested) 

throw new OperationCanceledException(token);

使用“ ThrowIfCancellationRequested()任务”时,看起来可能更像这样:

int CalculatePrime(CancellationToken cancelToken, object digits) {

try{

while(true){

cancelToken.ThrowIfCancellationRequested();

//Long operation here...

}

}

finally{

//Do some cleanup

}

}

另外,Task.Wait(CancellationToken)如果令牌被取消,将抛出异常。要使用此方法,您需要将Wait调用包装在一个Try...Catch块中。

MSDN:如何取消任务

以上是 取消任务会引发异常 的全部内容, 来源链接: utcz.com/qa/399086.html

回到顶部