Mithilfe der async-Datareader

Wir sind ziemlich neu in diesem, aber wir versuchen zu nutzen, das neue async-datareader -

wir haben die Probe aus http://blogs.msdn.com/b/adonet/archive/2012/07/15/using-sqldatareader-s-new-async-methods-in-net-4-5-beta-part-2-examples.aspx

aber Probleme.
Was wir versuchen zu erreichen ist :-
Die gespeicherte Prozedur gibt 2 Tabellen, mit einem datareader, wir versuchen Sie zu füllen 2 Modelle asynchron, dh die 2 Modelle erstellt werden, zur gleichen Zeit und nicht zu warten, bis das erste Modell gebaut werden, bevor der zweite beginnen kann
(Wenn das Sinn macht?)

Unten ist das, was wir im moment haben :-

   public async Task<UsertResultsModel> GetResults(string user_ID)
    {
        UsertResultsModel rm = new UsertResultsModel();
        List<TableColumn> ltc = new List<TableColumn>();
        List<List<TableColumn>> lltc = new List<List<TableColumn>>();
        var col = 0;
        try
        {
            using (SqlConnection con = new SqlConnection(Config.DatabaseStringCDA))
            {
                await con.OpenAsync();
                SqlCommand com = new SqlCommand(@"USP_GET_USER_RESULTS", con);
                com.CommandType = CommandType.StoredProcedure;


                using (SqlDataReader rdr = await com.ExecuteReaderAsync())
                {
                    col = rdr.FieldCount;
                    while (await rdr.ReadAsync())
                    {
                        for (int i = 0; i < rdr.FieldCount; i++)
                        {
                            string colName = rdr.GetName(i).ToSafeString();
                            ltc.Add(new TableColumn(colName, rdr[i].ToSafeString(), 50, EnumColumnType.String, colName));
                        }
                        lltc.Add(ltc);
                    }
                    rm.Summary = new TableViewModel { Grid = lltc };

                    await rdr.NextResultAsync();
                    lltc = new List<List<TableColumn>>();

                    while (rdr.Read())
                    {
                        for (int i = 0; i < rdr.FieldCount; i++)
                        {
                            string colName = rdr.GetName(i).ToSafeString();
                            ltc.Add(new TableColumn(colName, rdr[i].ToSafeString(), 50, EnumColumnType.String, colName));
                        }
                        lltc.Add(ltc);
                    }
                    rm.Trend = new TableViewModel { Grid = lltc };
                }
            }  
        }
        catch (Exception ex)
        {
            log.Error(MethodBase.GetCurrentMethod(), ex);
            return null;

        }
        await Task.WhenAll();
        return rm;
       //return lltc;
    }

jedoch, den code schrittweise Durchlaufen, sobald wir schlagen Sie alle erwarten, Die Anwendung lädt einfach, und keine weitere code ist der hit..

Irgendwelche Tipps oder Empfehlungen für diese würde sehr geschätzt werden.

  • Randnotiz: SqlCommand auch implementiert IDisposable. Sie sollten auch eine using Erklärung dafür.
  • Sind Sie warten auf GetResults? Tut await Task.WhenAll(); wirklich kompilieren? Was erwarten Sie, es zu tun?
  • Konvention, Ihre async Methoden sollten Suffix Async.
  • Ja, await Task.WhenAll() nicht kompilieren (es ist ein params Methode), aber es ist so ziemlich ein no-op.
  • Richtig, @svick. Ich war so verdutzt zu sehen, dass der code, dass ich es vergessen habe war params Task[] und nicht nur Task[].
InformationsquelleAutor Simon | 2014-03-04
Schreibe einen Kommentar