2017-12-19 12 views
0

Ich habe eine Web api Controller get Aktion, die Daten in der Datenbank-Code ist alsMisunderstood or Wrong Logic für Async und warten in C# ADO-Code mit

public async Task<HttpResponseMessage> Get(string UserName, string Password) 
    { 

     SqlParameter[] parameters = { new SqlParameter("@UserId", UserName), new SqlParameter("@Password", Password) }; 
     AdoHelper DBHelper = new AdoHelper(); 
     Company c = new Company(); 

     await DBHelper.ExecDataSetProcAsync("[dbo].[usp_Insertuser]", parameters).ContinueWith(Task => 
     { 

      DataSet ds = Task.Result; 
      if (ds != null && ds.Tables.Count == 1) 
      { 
       if (ds.Tables[0].Rows.Count >= 1) 
       { 
       } 
      } 
      ds.Dispose(); 
      Task.Dispose(); 
     }); 

     HttpResponseMessage response = new HttpResponseMessage() 
     { 
      Content = new StringContent("ok", Encoding.UTF8, "text/plain") 
     }; 
     return response; 
    } 

Wo, wie mein AdoHelper methos einfügt ist als

Jetzt rufe ich diese Web-API-Controller-Methode und möchte Daten von 10.000 Benutzern in Schleife einfügen, aber es öffnet 147 Verbindung mit Datenbank und dann Threads starten 500 internen Serverfehler senden Ich denke, Async und warten Aufgabe Datenbankverbindung nicht schließen richtig. Freundlicher Rat, was mit meiner Implementierung falsch gelaufen ist oder wenn ich dieses Async falsch verstanden habe und in C# abwartet.

Antwort

0

Sie sollten keine neue Aufgabe erstellen stattdessen verwenden Sie die Async-Methoden, die ADO verfügbar machen.

Auch anstatt die Verbindungen manuell entsorgen, wickelt alles in mit Aussagen

public async Task<DataSet> ExecDataSetProcAsync(string qry, params object[] args) 
{ 
    var ds = new DataSet(); 
    var builder = new SqlConnectionStringBuilder(DBConnection.GetConnectionString()) 
    { 
     AsynchronousProcessing = true 
    }; 
    using (var conn = new SqlConnection(builder.ConnectionString)) 
    { 
     await conn.OpenAsync(); 
     using (var cmd = CreateCommand(qry, CommandType.StoredProcedure, args)) 
     { 
      cmd.Connection = conn; 
      using(var reader = await cmd.ExecuteReaderAsync()) 
      { 
       if (await reader.ReadAsync()) 
       { 
        while (await reader.ReadAsync()) 
        { 
         ds.Tables.Add().Load(reader); 
        } 
       } 
      } 
     } 
    } 
    return ds; 
} 
+0

Problem ist mit der Verbindung, die nie und dann nach Ihrer Code-Implementierung wird geschlossen 'Task.Result' gibt leere Datenmenge. Danke für Ihre Antwort, reduzierte es die Ausführungszeit der gesamten API –

+0

@NaveedYousaf tut den Code "ds.Tables.Add(). Laden (Leser);" die Daten dem Dataset hinzufügen? Wenn nicht, ändere diesen Teil –