引发OperationCanceledException的原因可能有以下几种:
- 已设置取消令牌,或
- 发生超时(任务取消异常)
要解决此问题,常用的解决方法(如此处所述,等人:Distinguish timeout from user cancellation)的计算公式如下:
catch (OperationCanceledException ex)
{
if (token.IsCancellationRequested)
{
return -1;
}
return -2;
}
但是,对我来说,查看赋予异常的实际取消状态会更有意义。
if (ex is OperationCanceledException ocEx)
{
if (ocEx.CancellationToken.IsCancellationRequested)
{
return -1;
}
return -2;
}
我是不是漏掉了什么,是不是有什么原因没有把它作为这个常见问题的解决方案来推广?
1条答案
按热度按时间h5qlskok1#
ocEx.CancellationToken.IsCancellationRequested
在99%的情况下会是true
,所以如果你这样做,你的方法在99%的情况下会返回-1
,检查token.IsCancellationRequested
的原因是你想区分:OperationCanceledException
是由已知的token
的抵消引起的。OperationCanceledException
有其他原因。您不能100%确定是您的
token
导致了异常,因为存在争用条件:异常可能发生在取消token
之前,然后在检查token.IsCancellationRequested
之前不久取消了token
。但是这种争用条件很微妙,不是很重要,无论如何您都不能对此做任何事情。