【问题标题】:appending timeouts to asynchronous requests in WinRT在 WinRT 中将超时附加到异步请求
【发布时间】:2013-03-04 09:21:05
【问题描述】:

我正在使用这段代码将 TimeOut 附加到我正在发出的请求调用中,以确保我们不会遇到缓慢的互联网连接 - 并且处理得当。
当我满足超时条件时,我收到一条错误消息,我无法在扩展函数中修复。

一般如何完成这项任务?

代码:

public static class SOExtensions
{
    public static Task<T> WithTimeout<T>(this Task<T> task, TimeSpan duration)
    {
        return Task.Factory.StartNew(() =>
        {
            bool b = task.Wait(duration);
            if (b) return task.Result;
            return default(T);
        });
    }
}

用法:

var response = await HttpWebRequest
                     .Create(request)
                     .GetResponseAsync()
                     .WithTimeout(TimeSpan.FromSeconds(1));

我用这个处理AggregateException(并通过WebException),但是当超时失败时它仍然会生成AggregateException

【问题讨论】:

    标签: c# exception-handling windows-runtime async-await dotnet-httpclient


    【解决方案1】:

    我建议使用 CancellationToken 超时 (new CancellationTokenSource(myTimeSpan).Token),然后您可以在您的 async 方法中使用 (例如,对于 HttpClient,您将令牌传递给 @ 987654325@ 方法)。这占用的资源更少,因为 HTTP 请求本身被取消了。

    但如果您想要“外部”超时,更自然的方法是:

    public static async Task<T> WithTimeout<T>(this Task<T> task, TimeSpan duration)
    {
      var timeout = Task.Delay(duration);
      var completeTask = await Task.WhenAny(task, timeout);
      if (completeTask == timeout)
        return default(T);
      else
        return await task;
    }
    

    这将防止异常被包装到AggregateException 中。不过,它的效率不如CancellationToken 方法,看起来像这样:

    var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(1));
    var response = await new HttpClient().GetAsync(uri, timeout.Token);
    

    请注意,如果超时,CancellationToken 方法将抛出 OperationCanceledException 而不是返回 default(T)

    【讨论】:

    • 工作得很好,谢谢。我将在下一个 sprint 中尝试 CancellationToken 位,并在此处报告。
    • 实际上并没有为我工作。它不再超时,并声称我没有处理 WebException,即使我已经这样做了。将尝试第二种方法,然后标记答案
    • CancellationToken 是要走的路,太糟糕了,当您在线搜索时,它并不清楚。谢谢斯蒂芬。
    • Stephen:仅当 CancellationToken 超时小于 HttpClient.Timeout 时,才能使用 CancellationToken 和 HttpClient.GetAsync 进行超时。这是一个有点烦人的设计决定,并且一直是混乱的根源,我见过很多错误,但我怀疑一个不太可能改变。
    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多