我只是试图使我的 ASP .NET MVC 应用程序的一部分异步,但即使在阅读并尝试了很多之后,我也并不真正理解 async-await 模式,希望有人能给我一个提示。
基本上我有以下几点:
对我的控制器的 javascript 调用,它获取图表的部分视图(这在许多图表的页面加载后发生了几次)
// Load content of one chart my.loadChartContent = function (data, callback) { $.post("/Dashboard/GetChartContent/", data, function (datain) { if (isFunction(callback)) callback(datain); }); };
调用另一个类中的数据库方法的控制器操作
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-Action 似乎被阻止,直到 DataService 类的结果返回。我想启动对数据库的所有查询并异步等待结果,以便长时间运行的查询不会阻塞较短的查询。(在 SQL Server Profiler 中,我看到查询为 Begin-End、Begin-End、Begin-End => 但它应该是 begin-begin-begin - end-end-end)
我应该在哪里使用异步等待?将它(以某种方式)用于我的控制器操作是否足够,或者是否有必要使整个“调用链”异步?
更新: 当我使用 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;
}