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

标签 c# asp.net asp.net-mvc asynchronous async-await

我只是试图让我的 ASP .NET MVC 应用程序异步化,但即使在阅读和尝试了很多之后,我也不太理解异步等待模式,希望有人能给我提示。

基本上我有以下内容:

  1. 对我的 Controller 的 javascript 调用,它获取图表的部分 View (对于大量图表,这在页面加载后发生多次)

    // Load content of one chart
    my.loadChartContent = function (data, callback) {
    $.post("/Dashboard/GetChartContent/", data, function (datain) {
        if (isFunction(callback))
            callback(datain);
    });
    };
    
  2. 调用另一个类中的数据库方法的 Controller 操作

    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);
    }
    
  3. 数据类 (_dataService),它使用 SqlDataReader 从数据库中获取数据并使用该数据加载 DataTable。

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

我应该在哪里使用 async-await?将它(以某种方式)用于我的 Controller 操作是否足够,或者是否有必要使整个“调用链”异步?

更新: 当我使用 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;
    }

最佳答案

谢谢大家的回答。但真正的答案比我想象的要简单得多。斯蒂芬用这句话为我指明了正确的方向

All HTTP calls are naturally asynchronous.

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

所以 - 只需用 ... 装饰我的 Controller

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

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

@Stephen - 超过 2 个并发请求 => http://www.browserscope.org/?category=network

关于c# - 如何使这个异步? (异步、等待 - C#、MVC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19290898/

相关文章:

c# - 在UWP中处理未处理的异常-Windows 10

c# - Webbrowser 禁用所有音频输出 - 从在线广播到 youtube

c# - 创建实现接口(interface)的匿名类

c# - 必须将对 Bind 的调用分配给模板内控件的属性

asp.net-mvc - ASP.NET MVC 5 向每个 url 添加一个额外的查询字符串参数

c# - 在没有 File.Copy() 的情况下将应用程序 dll 从一个系统发送到另一个系统

asp.net-mvc - ASP.NET MVC SEO 友好 URL

c# - AutoMapper 4.2 和 Ninject 3.2

c# - 防止 MVC View 提交

c# - 使用正则表达式验证 SMTP 地址有什么意义吗?