Jet*_*223 4 c# asp.net asp.net-mvc asynchronous async-await
我只是尝试将我的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);
});
};
Run Code Online (Sandbox Code Playgroud)控制器操作,在另一个类中调用数据库方法
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)数据类(_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)
谢谢大家的答案.但真正的答案比我想象的简单得多.斯蒂芬用句子向我指出了正确的方向
所有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
| 归档时间: |
|
| 查看次数: |
10501 次 |
| 最近记录: |