Wie man so asynchron? (async, await in C#, MVC)

Ich habe gerade versucht, einen Teil meiner ASP .NET MVC-Anwendung asynchron-aber auch nach der Lektüre und der Versuch, eine Menge, die ich nicht wirklich verstehen, die async-await-Muster und hoffe, jemand könnte mir einen Tip geben.

Grundsätzlich habe ich die folgenden:

  1. Einen javascript-Aufruf an mein controller holt sich eine teilweise Ansicht für ein Diagramm (das passiert mehrmals nach dem laden der Seite für eine Menge von Diagrammen)

    //Load content of one chart
    my.loadChartContent = function (data, callback) {
    $.post("/Dashboard/GetChartContent/", data, function (datain) {
        if (isFunction(callback))
            callback(datain);
    });
    };
  2. Einer controller-action, die fordert, eine Datenbank-Methode in einer anderen Klasse

    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. Die Daten-Klasse (_dataService), die holt sich die Daten aus der Datenbank mit einem SqlDataReader-und lädt ein DataTable mit Daten.

Das problem ist, dass obwohl der Code asynchron ausgeführt, die Controller-Aktionen zu sein scheint, blockiert, bis ein Ergebnis aus der DataService-Klasse gibt. Beginnen möchte ich alle Abfragen in der Datenbank und warten auf die Ergebnisse asynchron, so dass lange andauernde Abfragen nicht blockieren kürzeren. (In SQL Server Profiler sehe ich die Abfragen als Beginn-Ende Beginn-Ende Beginn-Ende => jedoch sollte es beginnen-beginnen-Anfang - Ende-Ende-Ende)

Wo soll ich verwenden async-await? Ist es genug, um es (irgendwie) für meine controller-action oder ist es notwendig, um die ganze "call-Kette" asynchron?

Update:
Wenn ich SQLConnection.OpenAsync und ExecuteReaderAsync der code wird nie abgeschlossen...und ich weiß nicht, warum?

    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;
    }
Könnten Sie zeigen uns den code für die "lange-Abfragen ausführen"?
Der code ist nur ein basic cmd.ExecuteReader() und DataTable.Load(reader), die füllt eine datatable. Es ist nicht ein sql problem .
Sollten Sie die asynchrone version der Methoden (BeginExecuteReader und ReadAsync im SqlDataReader) blogs.microsoft.co.il/blogs/bnaya/Archiv/2012/01/15/...
Überprüfen Sie die Antworten hier: stackoverflow.com/questions/13131776/...
Leider habe ich es nicht bekommen. Bitte siehe mein update oben.

InformationsquelleAutor Jetro223 | 2013-10-10

Schreibe einen Kommentar