当前位置: 首页 > 编程语言 > C#

区分超时和用户取消

时间:2023-04-11 02:57:53 C#

区分超时和用户取消HttpClient具有内置的超时功能(尽管都是异步的,即超时可以被认为与http请求功能正交,因此可以被通用异步实用程序使用处理,但除此之外)并且当超时开始时,它将抛出TaskCanceledException(包装在AggregateException中)。TCE包含等于CancellationToken.None的值。现在,如果我为HttpClient提供我自己的CancellationToken并使用它在操作完成(或超时)之前取消操作,我会得到完全相同的TaskCanceledException,同样是CancellationToken.None。是否还有一种方法,仅通过查看抛出的异常来确定超时是否取消了请求,而不必让我自己的CancellationToken访问检查异常的代码?PS这可能是一个错误,CancellationToken错误地修复了CancellationToken.None吗?在使用自定义CancellationToken取消的情况下,我希望TaskCanceledException.CancellationToken等于该自定义令牌。编辑为了使问题更清楚,可以通过访问原始的CancellationTokenSource轻松区分超时和用户取消:origCancellationTokenSource.IsCancellationRequested==true从异常中获取CancellationToken虽然给出了错误的答案:((TaskCanceledException)e.InnerException).CancellationToken.IsCancellationRequested==false下面是一个最小的例子,由于流行的需求:(Exceptione){TaskCanceledExceptioninnerException=e.InnerExceptionasTaskCanceledException;booltimedOut=innerException!=null&&innerException.CancellationToken.IsCancellationRequested==false;//不幸的是,上面的isalques.IsCancellation//不管请求是不是//使用CancellationTaskSource.Cancel()取消//或者如果它超时}});}publicTaskmakeRequest(){varcts=newCancellationTokenSource();HttpClient客户端=newHttpClient(){Timeout=TimeSpan.FromSeconds(10)};HttpRequestMessagehttpRequestMessage=newHttpRequestMessage(HttpMethod.Get,"url");passCancellationTokenToOtherPartOfTheCode(cts);返回client.SendAsync(httpRequestMessage,cts.Token);接受的答案绝对是它在理论上应该如何工作,但遗憾的是,在实践中,IsCancellationRequested没有(可靠地)设置在附加到异常的令牌上:取消HttpClient请求-为什么TaskCanceledException.CancellationToken.IsCancellationRequested为假?是的,它们都返回相同的异常(可能是因为内部使用令牌超时),但您可以通过这样做轻松弄清楚:catch(OperationCanceledExceptionex){if(token.IsCancellationRequested){return-1;}返回-2;所以基本上如果你得到一个异常但是你的令牌没有被取消,那么它就是一个常规的http超时以上就是C#学习教程:区分用户取消超时的全部内容,如果对大家有帮助有用,需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: