gpt4 book ai didi

c# - 区分超时和用户取消

转载 作者:IT王子 更新时间:2023-10-29 04:19:41 30 4
gpt4 key购买 nike

HttpClient 有一个内置的超时功能(尽管都是异步的,即超时可以被认为与 http 请求功能正交,因此由通用的异步实用程序处理,但除此之外)以及何时超时启动时,它将抛出一个 TaskCanceledException(包含在一个 AggregateException 中)。

TCE 包含一个 CancellationToken,它等于 CancellationToken.None

现在,如果我为 HttpClient 提供我自己的 CancellationToken 并使用它在操作完成(或超时)之前取消操作,我会得到完全相同的 TaskCanceledException,同样带有 CancellationToken.None

是否还有办法,仅通过查看抛出的异常,来确定超时是否取消了请求,而不必让我自己的 CancellationToken 可访问检查异常的代码?

附言这可能是一个错误,CancellationToken 以某种方式错误地固定为 CancellationToken.None?在使用自定义 CancellationToken 取消 的情况下,我希望 TaskCanceledException.CancellationToken 等于该自定义 token 。

编辑为了让问题更清楚一点,通过访问原始的CancellationTokenSource,很容易区分超时和用户取消:

origCancellationTokenSource.IsCancellationRequested == true

从异常中获取 CancellationToken 虽然给出了错误的答案:

((TaskCanceledException) e.InnerException).CancellationToken.IsCancellationRequested == false

这里一个最小的例子,由于大众需求:

public void foo()
{
makeRequest().ContinueWith(task =>
{
try
{
var result = task.Result;
// do something with the result;
}
catch (Exception e)
{
TaskCanceledException innerException = e.InnerException as TaskCanceledException;
bool timedOut = innerException != null && innerException.CancellationToken.IsCancellationRequested == false;

// Unfortunately, the above .IsCancellationRequested
// is always false, no matter if the request was
// cancelled using CancellationTaskSource.Cancel()
// or if it timed out
}
});
}

public Task<HttpResponseMessage> makeRequest()
{
var cts = new CancellationTokenSource();
HttpClient client = new HttpClient() { Timeout = TimeSpan.FromSeconds(10) };
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "url");

passCancellationTokenToOtherPartOfTheCode(cts);
return client.SendAsync(httpRequestMessage, cts.Token);
}

最佳答案

公认的答案肯定是这 应该 在理论上如何工作,但不幸的是在实践中 IsCancellationRequested 没有(可靠地)设置在附加到异常的 token 上:

Cancelling an HttpClient Request - Why is TaskCanceledException.CancellationToken.IsCancellationRequested false?

关于c# - 区分超时和用户取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666922/

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