繁体   English   中英

使用异步数据读取器

[英]Using the async 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

但遇到问题。 我们想要实现的是:-存储的proc返回2个表,使用数据读取器,我们试图异步填充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;
    }

但是,单步执行代码,一旦我们遇到任何等待,应用程序就会简单地加载,而不会再打任何代码。

任何建议或建议,将不胜感激。

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

即使部分可能要花一些时间,await / async也允许您以顺序的方式编写代码。 代码完全按照您期望的顺序流动,每次await后的行都不会运行,直到等待的项完成为止,但是当前线程将退绕到堆栈上,因此可以继续进行其他操作。

如果要使用await / async同时执行两件事,则需要像传统TPL一样将每一个包裹在一个返回Task的函数中。 这样,您可以保留任务,而无需等待它们的结果,直到您想要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM