async / await dans l'action du contrôleur MVC
J'ai un Index
action en ASP.net MVC contrôleur. Cette action, les appels téléphoniques (entre autres choses) une action privée ne compter sur une table SQL avec un grand nombre de lignes. Le nombre retourné sera inséré dans une vue sac de la propriété.
public ActionResult Index()
{
//do things
ViewBag.NumberOfRows = NumberOfRows();
return View();
}
private string NumberOfRows()
{
//sql connection and row count
return numberOfRows;
}
Cela fonctionne, mais je ne peux pas voir la page de l'Index jusqu'à ce que tout est exécuté, de même que le nombre de lignes.
Je voudrais, au lieu de cela, Index
action à effectuer immédiatement, même si la fonction privée n'a pas encore été terminé. Que lorsque le comte a été terminé de définir une valeur à la vue du sac de la propriété.
Pour l'instant j'ai fait ceci:
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();
}
Cela fonctionne. Mais est-ce vraiment asynchrone? Suis-je raté quelque chose, il y a d'autres façon de faire cela?
source d'informationauteur BAD_SEED
Vous devez vous connecter pour publier un commentaire.
Son
async
appel, mais il est important de comprendre ici, c'est quand vous faites votre contrôleur de l'actionasync
dans ce cas : thread(de asp.net pool de threads) qui le traitement des demandes de retour pour le pool de thread (asp.net demande de pool de threads ).Ce qui signifie que la libération fil de thead piscine pour gérer plus de demande (C'est à dire async contrôleur de l'action vient de les aider à gérer plus de demande, il n'est pas pour autant qu'il diminuez votre temps de traitement, Il suffit de faire votre serveur plus réactif). une fois l'opération sous async/await est complétée nouveau thread du pool de threads de requête n'a plus de traitement.
Si vous voulez un vrai page asynchrone c'est à dire vous voulez rendre votre page plus réactif je suggère de faire appel à l'aide de
.ajax()
fonction de jQuery ou ajax extesion disponible dans Asp.net MVC.Il est asynchrone dans le fait que, une fois que vous interroger votre base de données (qui est un IO opération), vous libérer de l'ASP.NET Thread du Pool de thread au lieu de l'utiliser pour bloquer jusqu'à ce que la requête se termine.
Async ne veut pas dire "Renvoyer cette demande à l'appelant, et je vais terminer l'exécution à une date ultérieure"qui est un peu ce que vous attendez. Il ne rompt pas le HTTP protocole de demande-réponse. Ce que vous voulez n'est pas obtenue par async.
Si vous voulez à la demande pour effectuer immédiatement, vous aurez besoin de faire la queue sur un thread d'arrière-plan, et de pousser les données côté client une fois l'opération terminée.