使用async Datareader

时间:2014-03-04 11:10:24

标签: c# .net .net-4.5 async-await

我们对此很陌生,但我们正在尝试使用新的异步数据加载器

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

中的示例

但遇到问题。 我们要努力实现的目标是: - 存储的proc返回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;
    }

然而,一旦我们点击任何等待,单步执行代码,应用程序只是加载,并且没有其他代码被击中..

对此提出任何建议或建议将不胜感激。

1 个答案:

答案 0 :(得分:5)

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

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

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