2016-04-06 1 views
2

Dies ist das erste Mal, dass ich async/await mit dem Dapper ORM verwende. Ich bekomme immer wieder die Meldung, dass meinem Controller die Warte-Methode fehlt. Wie kann ich die Warte-Methode korrekt in meinen Code einfügen?Wie verwende ich Dapper in einem asynchronen Controller?

public async Task<ActionResult> index(int? page) 
{ 

    if (page == null) 
    { 
     page = 1; 
     ViewBag.page = page; 
    } 
    else 
    { 

     ViewBag.page = page; 
    } 
    string Connectionstring = ConfigurationManager.ConnectionStrings["mycontext"].ConnectionString; 
    using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring)) 
    { 

     sqlConnection.Open(); 
     var sqlM = @"SELECT * from threads order by activities desc"; 
     var resultM = sqlConnection.Query<thread>(sqlM).ToList(); 
     await Task.WhenAll(resultM); 
     return View(new homepage { panel = resultM }); 
    } 


} 

Ich habe await Task.WhenAll(resultM); versucht, aber es hat nichts ändern.

Antwort

4

Sie erhalten die Warnung, weil Sie keine asynchronen Methoden im Controller verwenden. Wie es ist, gibt es keinen Grund, es als async zu markieren.

Um die Methode tatsächlich asynchron zu machen, müssen Sie Dappers Async-Methoden verwenden und auf sie warten. Ein anderes Beispiel hierfür finden Sie unter Using Async Await keywords with Dapper.

In Ihrem Code, würde es wie folgt aussehen:

public async Task<ActionResult> index(int? page) 
{ 

    if (page == null) 
    { 
     page = 1; 
     ViewBag.page = page; 
    } 
    else 
    { 

     ViewBag.page = page; 
    } 

    string Connectionstring = ConfigurationManager.ConnectionStrings["mycontext"].ConnectionString; 
    using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring)) 
    { 
     await sqlConnection.OpenAsync(); 

     var sqlM = @"SELECT * from threads order by activities desc"; 
     var resultM = await sqlConnection.QueryAsync<thread>(sqlM); 

     return View(new homepage { panel = resultM }); 
    } 
} 

Wenn resultM ein List<thread> statt IEnumerable<T> sein müssen, können Sie ToList nennen - aber stellen Sie sicher, dass es nach den asynchronen Aufruf wartet.

+0

Perfect vielen Dank, ich werde genau das tun. – user1591668

+0

@ user1591668 Kein Problem! Lass es mich wissen, wenn es für dich funktioniert. –