我已经从MSDN文章Using Asynchronous Methods in ASP.NET MVC 4中设置了示例,并进行了一些基准测试以了解我的想法。
服务器配置:

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

  • 我设置了2个 Controller SyncAsync,并使用加载程序工具进行了一些测试,以进行基准测试。加载程序工具仅发送50-60个恒定请求一分钟。每个 Controller 都调用相同的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会更快,没有超时等。只是看起来不对,我在这里做错什么了吗?可以做些什么来改善/修复它?
    第二个问题,通常使用WebRequests,有没有一种方法可以加快速度?我在global.asax中设置了以下内容,但仍不确定用法是否正确:
    System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
    
    另外,任何其他有助于加快应用程序执行这些类型的尝试的建议也将非常有帮助。

    最佳答案

    我认为线索在您的比较中

    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?

    关于c# - 带有问题的MVC Controller 上的异步基准与同步基准,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26184247/

    10-12 12:43
    查看更多