我只是试图让我的 ASP .NET MVC 应用程序异步化,但即使在阅读和尝试了很多之后,我也不太理解异步等待模式,希望有人能给我提示。
基本上我有以下内容:
对我的 Controller 的 javascript 调用,它获取图表的部分 View (对于大量图表,这在页面加载后发生多次)
// Load content of one chart my.loadChartContent = function (data, callback) { $.post("/Dashboard/GetChartContent/", data, function (datain) { if (isFunction(callback)) callback(datain); }); };
调用另一个类中的数据库方法的 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); }
数据类 (_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/