gpt4 book ai didi

c# - 将 OperationCanceledException 关联到 CancellationToken 的正确方法

转载 作者:行者123 更新时间:2023-12-03 16:19:08 30 4
gpt4 key购买 nike

我正在使用一个支持取消的异步 api,我正在向该 api 传递一个 CancellationToken实例。像往常一样,如果在传递的 token 上请求取消,我正在调用的 api 将抛出 OperationCanceledException (这是 .NET 框架的标准协作取消模式)。
我希望能够 catch OperationCanceledException 当且仅当 这是由于取消提供的取消 token 而引发的异常。
以下代码说明了我要实现的目标:

try 
{
await _service.DoSomethingAsync(cancellationToken: token);
}
catch (OperationCanceledException ex) when ( /* here I want a condition signifying that the OperationCanceledException is caused by the cancellation of the token object */)
{
// avoid logging the exception: this is raised by design (cooperative cancellation)
throw;
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred: {0}", ex.Message);
throw;
}
对于上面代码的异常过滤器,我基本上有两个想法:
  • 检查 IsCancellationRequested token 上的属性(property)对象:when (token.IsCancellationRequested)
  • 检查 CancellationToken ex 上的属性(property)对象:when (ex.CancellationToken == token)

  • 进行我想要执行的检查的正确方法是什么?上面显示的两种方式是否等效?有最佳实践吗?
    重要提示 :我知道上面显示的代码可以用更有效的方式编写,因为捕获异常是一项昂贵的操作。最好的办法可能是删除第一个 catch完全阻止,并且只捕获一个 Exception当且仅当它与 token 的取消无关目的。我知道这一点,但这不是我的问题的重点。 我在问题中编写代码只是为了清楚起见 ,因为我的问题的重点是如何正确关联 OperationCanceledExceptionCancellationToken这导致了异常本身。

    最佳答案

    I want to be able to catch the OperationCanceledException if and only if it is the exception raised due to the cancellation of the provided cancellation token.


    您不能完全做到这一点,但您可以“仅在我提供的 token 已被取消时才捕获已取消的异常”,这通常已经足够了。 when (token.IsCancellationRequested)是你想要的。
    不查 ex.CancellationToken ,因为您正在调用的方法可能正在观察链接的取消 token ,这与您提供的不同。

    关于c# - 将 OperationCanceledException 关联到 CancellationToken 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67203796/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com