使用async Datareader

Sim*_*mon 1 .net c# async-await .net-4.5

我们对此很陌生,但我们正在尝试使用新的异步datareader

我们一直在关注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

但遇到问题.我们要实现的目标是: - 存储过程返回2个表,使用datareader,我们尝试异步填充2个模型,即2个模型将同时创建,而不必等待第一个模型在第二个开始之前建立(如果这有意义?)

以下是我们目前的情况: -

   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;
    }
Run Code Online (Sandbox Code Playgroud)

然而,单步执行代码,只要我们等待任何等待,应用程序只需加载,并且不会再发出任何代码.

对此的任何建议或建议将不胜感激.

Gaz*_*yer 5

异步部分是DB I/O,这意味着当您正在等待打开或读取时,您的应用程序可以自由地执行其他操作而不是阻止数据库.

await/async允许您以顺序方式编写代码,即使部分可能需要一段时间.代码的流程与您按预期的顺序完全相同,每个代码行之后的行都await不会运行,直到等待的项目结束,但是当前的线程退回堆栈,以便它可以继续执行其他操作.

如果你想使用await/async一次做两件事,那么你需要将每个事件包装在一个返回Task传统TPL 的函数中.这样你就可以在没有等待结果的情况下保持任务,直到你想要.