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

本文关键字:HttpClient 响应时间 运行时 并行 | 更新日期: 2023-09-27 17:50:51

. 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;

我怎样才能知道每个请求需要多长时间才能完成,以便我可以在我的页面上显示该信息?

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

我可能会尝试这样做:

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);
    }
}

现在在。net Core中有一个选项可能会给你更好的结果,至少在我的情况下,运行时间比使用@ollifant建议的方法低10-40%左右。我将继续按照他的建议,但将秒表移动到处理器。

你可以使用DelegatingHandler,例如。net Core Docs。

您仍然可以像上面建议的那样使用Stopwatch,而不是在处理程序本身。我将经过的时间添加到Header中,然后在例如您的_GetHttpWithTimingInfo中检索并进一步处理。最有可能的是,您可以DI一些服务,并将持续时间从处理程序本身保存到数据库,这取决于您的项目。

也许,这个解决方案也可以解决@Dmytro Bogatov提到的问题。

同样,此方法直接用于。net Core HTTP日志检查SendAsync。注意他们使用的是内部的ValueStopwatch而不是Stopwatch。

这些日志显示在处理程序中使用Stopwatch与直接在方法中使用Stopwatch:

08-11-2020 18:05:52.024 [INF] Handler: 992, _GetHttpWithTimingInfo 995
08-11-2020 18:05:52.153 [INF] Handler: 663, _GetHttpWithTimingInfo 1249
08-11-2020 18:05:52.208 [INF] Handler: 999, _GetHttpWithTimingInfo 1220
08-11-2020 18:05:52.219 [INF] Handler: 1002, _GetHttpWithTimingInfo 1241
08-11-2020 18:05:52.219 [INF] Handler: 989, _GetHttpWithTimingInfo 1217
08-11-2020 18:05:52.255 [INF] Handler: 609, _GetHttpWithTimingInfo 1302
08-11-2020 18:05:52.260 [INF] Handler: 959, _GetHttpWithTimingInfo 1267
08-11-2020 18:05:52.287 [INF] Handler: 1063, _GetHttpWithTimingInfo 1303
08-11-2020 18:05:52.292 [INF] Handler: 515, _GetHttpWithTimingInfo 1381
08-11-2020 18:05:52.296 [INF] Handler: 992, _GetHttpWithTimingInfo 1286
08-11-2020 18:05:52.321 [INF] Handler: 953, _GetHttpWithTimingInfo 1323
08-11-2020 18:05:52.324 [INF] Handler: 973, _GetHttpWithTimingInfo 1304
08-11-2020 18:05:52.326 [INF] Handler: 985, _GetHttpWithTimingInfo 1302