У меня есть действие Index
в ASP.net MVC-контроллере. Это действие вызывает (среди прочего) частное действие, которое рассчитывает на таблицу SQL с большим набором строк. Возвращаемое число будет вставлено в свойство пакета просмотра.
public ActionResult Index()
{
// do things
ViewBag.NumberOfRows = NumberOfRows();
return View();
}
private string NumberOfRows()
{
// sql connection and row count
return numberOfRows;
}
Это работает, но я не вижу страницу Index, пока все не будет выполнено, даже подсчет строк.
Я бы вместо этого выполнил Index
действие, чтобы немедленно завершить, даже если частная функция еще не завершена. Затем, когда счетчик был завершен, задайте значение свойства пакета просмотра.
Сейчас я сделал это:
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();
}
Это работает. Но действительно ли это асинхронно? Мне что-то не хватает, есть ли другой способ сделать это?