如何使这个异步?(异步,等待 - C#,MVC)

Jet*_*223 4 c# asp.net asp.net-mvc asynchronous async-await

我只是尝试将我的ASP .NET MVC应用程序的一部分异步,但即使在阅读并尝试了很多之后我也不太了解async-await模式并希望有人能给我一个提示.

基本上我有以下几点:

  1. 一个javascript调用我的控制器获取图表的部分视图(这在很多图表的页面加载后发生了几次)

    // Load content of one chart
    my.loadChartContent = function (data, callback) {
    $.post("/Dashboard/GetChartContent/", data, function (datain) {
        if (isFunction(callback))
            callback(datain);
    });
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. 控制器操作,在另一个类中调用数据库方法

    public ActionResult GetChartContent(int id, bool isDraft = false)
    {
        //do something
        //...
    
        var chartdata = _dataService.GetDataForChart(chart, isDraft, _user.Id); //long running query
    
        //do something with chartdata
    
        return View(chartdata);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 数据类(_dataService),它使用SqlDataReader从数据库中获取数据,并使用该数据加载DataTable.

问题是虽然javascript是异步执行的,但是在DataService类返回结果之前,Controller-Actions似乎被阻塞了.我想启动对数据库的所有查询并异步等待结果,以便长时间运行的查询不会阻止较短的查询.(在SQL Server Profiler中,我将查询视为Begin-End,Begin-End,Begin-End =>但它应该是begin-begin-begin - end-end-end)

我应该在哪里使用async-await?是否足以将它(某种程度上)用于我的控制器动作,还是必须使整个"调用链"异步?

更新: 当我使用SQLConnection.OpenAsync和ExecuteReaderAsync时,代码永远不会完成......我不明白为什么?

    public async Task<Query> GetSqlServerData(Query query)
    {
        var dt = new DataTable();
        var con = new SqlConnection(query.ConnectionString);

        await con.OpenAsync();
        var cmd = new SqlCommand(query.SelectStatement, con);
        var datareader = await cmd.ExecuteReaderAsync();

        dt.Load(datareader);

        con.Close();
        query.Result = dt;
        return query;
    }
Run Code Online (Sandbox Code Playgroud)

Jet*_*223 5

谢谢大家的答案.但真正的答案比我想象的简单得多.斯蒂芬用句子向我指出了正确的方向

所有HTTP调用都是自然异步的.

我知道并且通常这是真的,但显然不是在你使用会话时,因为ASP.NET MVC等待每个请求(来自一个用户)完成以同步会话.您可以在这里找到更好的解释:http://www.stefanprodan.eu/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/

所以 - 只需用...装饰我的控制器

[SessionState的(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

...做到了,现在我得到了我想要的结果 - 在我的SQL Server上同时查询并且响应时间更快.

@Stephen - 它是超过2个同时请求=> http://www.browserscope.org/?category=network