C#报”OperationCanceledException”的原因以及解决办法

  • Post category:C#

当在.Net应用程序中使用异步任务时,可能会遇到OperationCanceledException异常。这个异常通常是由于某些操作被取消引起的。

原因

这个异常通常是由于以下原因之一引起的:

  1. CancellationToken被取消。这可能是由于用户取消了任务、超时,或者被外部事件取消等等。

  2. TaskTask<TResult>CancelAfter方法被调用并且到达了取消时间。

  3. 其他原因导致操作被取消,例如网络问题、进程终止等等。

解决办法

要处理OperationCanceledException异常,可以采取以下 办法:

  1. 检查CancellationTokenIsCancellationRequested属性是否为true。如果是,这意味着任务已被取消,应该尽快退出。
try
{
    await SomeAsyncOperationAsync(cancellationToken);
}
catch(OperationCanceledException ex)
{
    if(cancellationToken.IsCancellationRequested)
    {
        // Handle cancellation
    }
    else
    {
        // Handle other exceptions
    }
}
  1. 可以使用CancellationToken.ThrowIfCancellationRequested()方法来主动抛出一个OperationCanceledException异常,以暂停正在进行的工作或任务,或者清理异常状态。
public async Task FooAsync(CancellationToken cancellationToken)
{
    await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken);

    cancellationToken.ThrowIfCancellationRequested();

    // Perform some long running operation...
}
  1. 如果需要对操作进行超时控制,可以使用CancellationTokenSourceCancelAfter方法来定时取消操作。
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // cancel after 5 seconds

try
{
    await SomeAsyncOperationAsync(cts.Token);
}
catch(OperationCanceledException ex)
{
    if(cts.Token.IsCancellationRequested)
    {
        // Handle cancellation
    }
    else
    {
        // Handle other exceptions
    }
}
  1. 还可以在发生异常时重新尝试操作,直到达到最大重试次数或成功为止。
int retryCount = 0;
bool succeeded = false;

while(!succeeded && retryCount < MAX_RETRY_COUNT)
{
   try
   {
       await SomeAsyncOperationAsync(cancellationToken);
       succeeded = true;
   }
   catch(OperationCanceledException ex)
   {
       if(cancellationToken.IsCancellationRequested)
       {
           // Handle cancellation
           break;
       }
       else
       {
           // Handle other exceptions and retry
           retryCount++;
       }
   }
   catch(Exception ex)
   {
       // Handle other exceptions and retry
       retryCount++;
   }
}

综上所述,OperationCanceledException异常通常是由异步任务被取消引起的,可以通过检查CancellationToken的状态、使用ThrowIfCancellationRequested()方法、定时取消等方式来处理该异常。在具体场景中,应根据需要采用合适的解决方案来处理该异常。