.net 为什么在评估OperationCanceledException时检查cancelationToken?

pokxtpni  于 2023-01-18  发布在  .NET
关注(0)|答案(1)|浏览(106)

引发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;
}

我是不是漏掉了什么,是不是有什么原因没有把它作为这个常见问题的解决方案来推广?

h5qlskok

h5qlskok1#

if (ex is OperationCanceledException ocEx)
{
   if (ocEx.CancellationToken.IsCancellationRequested)
   {
       return -1;
   }

   return -2;
}

ocEx.CancellationToken.IsCancellationRequested在99%的情况下会是true,所以如果你这样做,你的方法在99%的情况下会返回-1,检查token.IsCancellationRequested的原因是你想区分:

  1. OperationCanceledException是由已知的token的抵消引起的。
  2. OperationCanceledException有其他原因。
    您不能100%确定是您的token导致了异常,因为存在争用条件:异常可能发生在取消token之前,然后在检查token.IsCancellationRequested之前不久取消了token。但是这种争用条件很微妙,不是很重要,无论如何您都不能对此做任何事情。

相关问题