【发布时间】:2023-03-08 07:06:02
【问题描述】:
我在 ASP.net MVC 控制器中有一个Index 操作。此操作调用(除其他外)一个私有操作,该操作对具有大量行的 SQL 表进行计数。返回的数字将插入到视图包属性中。
public ActionResult Index()
{
// do things
ViewBag.NumberOfRows = NumberOfRows();
return View();
}
private string NumberOfRows()
{
// sql connection and row count
return numberOfRows;
}
这可行,但在执行 所有内容 之前我看不到索引页面,甚至是行数。
相反,即使私有功能尚未完成,我也会立即完成 Index 操作。比当计数完成时为 view bag 属性设置一个值。
现在我已经这样做了:
private async Task<string> NumberOfRows()
{
SqlConnection connection = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.CommandText = "SELECT SUM (row_count) FROM sys.dm_db_partition_stats WHERE object_id=OBJECT_ID('aTable') AND (index_id=0 or index_id=1)";
cmd.CommandType = CommandType.Text;
cmd.Connection = connection;
await connection.OpenAsync();
reader = await cmd.ExecuteReaderAsync();
string numberOfRows = "N/A";
while (await reader.ReadAsync())
{
numberOfRows = reader.GetInt64(0).ToString();
}
connection.Close();
return numberOfRows ;
}
public async Task<ActionResult> Index(FormCollection form){
// do things;
ViewBag.NumberOfRows = await NumberOfRows();
return View();
}
这行得通。但这真的是异步的吗?我错过了什么吗,还有其他方法吗?
【问题讨论】:
-
请注意
SqlConnection、SqlCommand和SqlDataReader都实现了IDisposable接口,因此您应该考虑使用using语句 - 这适用于其中的异步操作好吧!另请参阅此问题以获取更多信息:stackoverflow.com/q/16985876/927511
标签: c# asp.net asp.net-mvc async-await