Comment faire de cette asynchrone? (async, attendent - C#, MVC)
J'ai juste essayé de faire une partie de mes ASP .NET MVC de l'Application asynchrone, mais même après avoir lu et essayer beaucoup de choses que je ne comprends pas vraiment l'async-attendent modèle et espère que quelqu'un pourrait me donner un indice.
Fondamentalement, je n'ai suivantes:
- Un appel javascript à mon contrôleur qui récupère une Vue partielle d'un graphique (ce qui arrive plusieurs fois après le chargement de la page pour beaucoup de graphiques)
//Load content of one chart my.loadChartContent = function (data, callback) { $.post("/Dashboard/GetChartContent/", data, function (datain) { if (isFunction(callback)) callback(datain); }); };
- L'action d'un contrôleur qui appelle une base de données méthode d'une autre classe
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); }
- La classe de données (_dataService) qui extrait les données à partir de la base de données avec un SqlDataReader et les charges d'un DataTable avec les données.
Le problème est que, bien que le javascript est exécuté de manière asynchrone le Contrôleur-Actions semble être bloquée jusqu'à ce qu'un résultat de l'instance DataService classe renvoie. Pour commencer, j'aimerais que toutes les requêtes à la base de données et d'attendre les résultats de manière asynchrone, de sorte que les requêtes de longue durée ne bloquent pas des plus courts. (Dans SQL Server Profiler, je vois les requêtes en tant que début-Fin, début-Fin, début-Fin => mais il devrait être de commencer-commencer-début - fin-fin-fin)
Où dois-je utiliser asynchrone-attendent? Est-ce assez pour l'utiliser (en quelque sorte) pour mon contrôleur de l'action ou est-il nécessaire de faire de l'ensemble de la "chaîne" asynchrone?
Mise à jour:
Lorsque j'utilise SQLConnection.OpenAsync et ExecuteReaderAsync le code ne se termine jamais...et je ne comprends pas pourquoi?
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;
}
Le code est seulement une base de cmd.ExecuteReader() et de la DataTable.Charge(lecteur) qui remplit une datatable. Ce n'est pas un problème sql .
Vous devez utiliser la version asynchrone de l'méthodes (
BeginExecuteReader
et ReadAsync
dans SqlDataReader
) blogs.microsoft.co.il/blogs/bnaya/archive/2012/01/15/...Cochez les réponses ici: stackoverflow.com/questions/13131776/...
Malheureusement, je ne l'obtenez pas. Veuillez voir ma mise à jour ci-dessus.
OriginalL'auteur Jetro223 | 2013-10-10
Vous devez vous connecter pour publier un commentaire.
Merci à vous tous pour vos réponses. Mais la vraie réponse est plus simple que je ne le pensais. Stephen m'a orienté dans la bonne direction avec la phrase
Je savais que, et généralement c'est vrai, mais évidemment pas lorsque vous utilisez des séances, car ASP.NET MVC attend pour chaque demande (à partir d'un utilisateur) afin de synchroniser de la session. Vous pouvez trouver une meilleure explication ici: http://www.stefanprodan.eu/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/
- À peine la décoration de mon contrôleur avec ...
...il l'a fait et maintenant j'ai le résultat que je voulais - requêtes simultanées sur mon Serveur SQL et beaucoup plus rapide temps de réponse.
@Stephen - c'est plus que 2 demandes simultanées => http://www.browserscope.org/?category=network
OriginalL'auteur Jetro223
Le terme "asynchrone" peut être appliqué de différentes façons. En JavaScript, tout est asynchrone. Tous HTTP appels sont naturellement asynchrone.
Si vous ne voyez pas tout sql qui se chevauchent, alors vous devez être sûr que vous appelez
loadChartContent
plusieurs fois (pas de l'appeler une fois à un moment enchaîné par des rappels ou quelque chose comme ça). Le navigateur va vous limiter à deux demandes simultanées, mais vous devriez voir deux demandes à la fois de frapper votre serveur sql server.Faire de votre côté serveur
async
ne vous aidera pas, carasync
ne pas modifier le protocole HTTP (comme je l'ai décrit sur mon blog). Même si vous faites votre accès à la base deasync
, votre action de contrôleur devra encore attendre pour eux de complet, et le navigateur va encore vous limiter à deux demandes en suspens. Côté serveurasync
est utile pour la mise à l'échelle de vos serveurs web, mais si votre serveur web est en train de parler à une seule SQL Server back-end, alors il n'y a pas de point de mise à l'échelle de votre serveur web parce que votre serveur web n'est pas le facteur déterminant dans votre évolutivité.Sur une note de côté, je soupçonne la raison de votre
async
code ne se termine jamais est parce que vous utilisezou
Wait
; je l'explique sur mon blog.Donc, retour à votre problème d'origine: si vous voulez commencer à tous les requêtes à la base de données, alors vous devez changer les API d'être "chunky" au lieu de "bavard". I. e., ajouter un
GetChartContents
action qui prend de multiples identifiants et exécute l'ensemble de ces requêtes en parallèle. Je vous recommande d'utiliserasync
base de données de méthodes avec quelque chose comme ceci:OriginalL'auteur Stephen Cleary
Je pense que ce tutoriel donne un assez bon point de départ pour ce que vous essayez de faire.
http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
OriginalL'auteur akrobet
Si vous avez:
Alors utiliser:
OriginalL'auteur Ahmed KRAIEM