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:

  1. 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);
    });
    };
  2. 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);
    }
  3. 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;
    }
Pourrais-tu nous montrer le code pour les "requêtes de longue durée"?
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