gpt4 book ai didi

c# - .NET C# : HttpClient and the TaskCanceledException exception

转载 作者:行者123 更新时间:2023-12-05 05:15:05 25 4
gpt4 key购买 nike

我已经开始使用 System.Net.Http.HttpClient,这是一个很棒的类(class)。我现在想让我的程序用户能够取消操作,例如,如果一堆 HTTP 请求需要很长时间才能完成。因此,很自然地,我遇到了 CancellationTokenSource 类,并修改了对 HttpClient 的异步方法的调用,以便也向它们传递一个 CancellationToken。在我的 UI 代码中,我现在可以“取消该 token ”,并且实际上它会中断当时正在进行的任何 HTTP 请求。

然而,我没想到的是,这会导致被中断的方法抛出TaskCanceledException异常。

这是我的问题:我查看了 HttpClient 的 MSDN 文档,但没有发现该异常。我想那是因为它是任何采用 CancellationToken 的异步方法的常见行为,但到目前为止我还没有找到太多相关信息。你能证实或证实我的假设,并指出相关文件吗?

我的“真正问题”是我是否正确使用了 CancellationToken 机制,也就是说,该异常是应该发生的,还是我做错了什么?

如果该异常应该发生,并且它是我可以依赖的机制,那么它将简化我的代码。现在,我在每次调用 HttpClient 异步方法后测试我的 token 的 IsCancellationRequested 属性以确定我的方法是应该继续还是返回,但是除了这个异常(exception),所有额外的代码都变成了毫无意义。

我正在使用此语句取消 token :

myCancellationTokenSource.Cancel();

最佳答案

Is catching TaskCanceledException and checking Task.Canceled a good idea?

In the .Net framework itself when you pass a CancellationToken as a parameter you will get back a TaskCanceledException. I would not go against that and create my own design pattern because people who are familiar with .Net will be familiar with your code.

My guideline is this: The one that cancels the token is the one that should handle the TaskCanceledException, so If you're using a CancellationToken inside your method for your own reasons, go ahead and use a try-catch block. But if you get the token as a parameter, let the exception be thrown.

https://blogs.msdn.microsoft.com/andrewarnottms/2014/03/19/recommended-patterns-for-cancellationtoken/

Don’t throw OperationCanceledException after you’ve completed the work, just because the token was signaled. Return a successful result and let the caller decide what to do next. The caller can’t assume you’re cancellable at a given point anyway so they have to be prepared for a successful result even upon cancellation.

在我看来,cancellationToken.ThrowIfCancellationRequested() 是处理大多数与 cancellationToken 交互的最简单方法。那么你只需要处理异常即可。

关于c# - .NET C# : HttpClient and the TaskCanceledException exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51915370/

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