如何在并行运行时获得HttpClient响应时间

Dan*_*ang 8 c# asynchronous task-parallel-library

在我的ASP.NET MVC4应用程序中,我有一个控制器操作,我可以在其中访问多个外部网站并收集我在页面上以聚合方式显示的信息.显然,我想并行执行此操作,因此我编写了类似于此的代码:

var client1 = new HttpClient().GetAsync("http://google.com");
var client2 = new HttpClient().GetAsync("http://stackoverflow.com");
var client3 = new HttpClient().GetAsync("http://twitter.com");

var result1 = client1.Result;
var result2 = client2.Result;
var result3 = client3.Result;
Run Code Online (Sandbox Code Playgroud)

如何找出每个请求完成的时间,以便我可以在我的页面上显示该信息?

oll*_*ant 9

我可能会尝试类似以下内容:

private async void _HttpServerDemo()
{
    var info1 = _GetHttpWithTimingInfo("http://google.com");
    var info2 = _GetHttpWithTimingInfo("http://stackoverflow.com");
    var info3 = _GetHttpWithTimingInfo("http://twitter.com");

    await Task.WhenAll(info1, info2, info3);
    Console.WriteLine("Request1 took {0}", info1.Result);
    Console.WriteLine("Request2 took {0}", info2.Result);
    Console.WriteLine("Request3 took {0}", info3.Result);
}

private async Task<Tuple<HttpResponseMessage, TimeSpan>> _GetHttpWithTimingInfo(string url)
{
    var stopWatch = Stopwatch.StartNew();
    using (var client = new HttpClient())
    {
        var result = await client.GetAsync(url);
        return new Tuple<HttpResponseMessage, TimeSpan>(result, stopWatch.Elapsed);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 那么,对这个问题的答案的共识似乎是*不是*使用下划线来表示私有方法. (2认同)
  • 这可能会导致错误的结果.如果没有准备好线程(或者上下文在其他地方使用),则await将不会持续一段时间 - 导致返回的时间跨度高于响应时间. (2认同)
  • 我曾经使用过这种方法.如果您启动20多个并行请求,它将大大失败.在有机会停止计时器之前,单个线程可能会等待一秒钟(!!!).公平地说,我仍然不知道更好的方式...... (2认同)