我已经设置了这篇MSDN文章Using Asynchronous Methods in ASP.NET MVC 4中的示例,并做了一些基准测试,以了解我的想法。
我设置了2个控制器Sync
和Async
,并使用加载器工具进行基准测试。加载器工具只发送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<ActionResult> 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<object> GetGizmosAsync(string uri)
{
using (HttpClient httpClient = new HttpClient())
{
var response = await httpClient.GetAsync(uri);
return (await response.Content.ReadAsAsync<object>());
}
}
第一个问题,是否有人知道为什么Async需要更长时间,运行更少并导致超时,而同步版本不是?我认为使用Async会更快,没有超时等等。只是看起来不对,我在这里做错了吗?可以做些什么来改进/修复它?
第二个问题,一般来说,使用WebRequest是否有办法加快速度?我在global.asax
中设置了以下内容,但仍不确定用法是否正确:
System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
此外,任何其他有助于加快执行这些类型的品尝的应用程序的建议将非常有帮助。
答案 0 :(得分:2)
webClient.DownloadString(uri)
到
var response = await httpClient.GetAsync(uri);
return (await response.Content.ReadAsAsync<object>());
也许你可以试试
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("");
});
这里有一个异步屈服点就足够了。
有关异步的详细信息,请参阅此答案: Do you have to put Task.Run in a method to make it async?