有问题的MVC控制器上的Async vs Sync基准测试

我已经设置了这篇MSDN文章在ASP.NET MVC 4中使用异步方法的示例,并做了一些基准测试以了解我的想法。

服务器配置:

  • Windows 7专业版(x64)
  • IIS 7.5
  • 英特尔酷睿i7-2600S @ 2.80HGz
  • 8GB内存
  • AppPool>最大工作进程:10

我设置了2个控制器SyncAsync ,并使用加载器工具进行基准测试。 加载器工具只发送50-60个常量请求一分钟。 每个控制器调用相同的Web服务3次。 每个代码如下:


同步:

 public ActionResult Sync() { var g1 = GetGizmos("url1"); var g2 = GetGizmos("url2"); var g3 = GetGizmos("url3"); return Content(""); } public object GetGizmos(string uri) { using (WebClient webClient = new WebClient()) { return JsonConvert.DeserializeObject( webClient.DownloadString(uri) ); } } 

同步

异步:

 public async Task Async() { var g1 = GetGizmosAsync("url1"); var g2 = GetGizmosAsync("url2"); var g3 = GetGizmosAsync("url3"); var a1 = await g1; var a2 = await g2; var a3 = await g3; return Content(""); } public async Task GetGizmosAsync(string uri) { using (HttpClient httpClient = new HttpClient()) { var response = await httpClient.GetAsync(uri); return (await response.Content.ReadAsAsync()); } } 

异步

第一个问题,有没有人知道为什么Async需要更长时间,运行更少并导致超时,而同步版本不是? 我认为使用Async会更快,没有超时等等。只是看起来不对,我在这里做错了吗? 可以做些什么来改善/修复它?

第二个问题,一般来说,使用WebRequests有没有办法加快速度? 我在global.asax设置了以下内容,但仍不确定用法是否正确:

 System.Net.ServicePointManager.DefaultConnectionLimit = 1000; 

此外,任何其他建议,以帮助加快执行这些类型的品尝的应用程序将是非常有帮助的。

我认为线索是你的比较

 webClient.DownloadString(uri) 

 var response = await httpClient.GetAsync(uri); return (await response.Content.ReadAsAsync()); 

也许你可以试试

 webclient.DownloadStringAsync(uri) 

并且您可以优化您的异步代码

 await Task.Run(() => { // just run your sync code here var g1 = GetGizmos("url1"); var g2 = GetGizmos("url2"); var g3 = GetGizmos("url3"); return Content(""); }); 

这里有一个异步屈服点就足够了。

有关异步的详细信息,请参阅此答案: 您是否必须将Task.Run放入一个方法以使其异步?