[英]Using async / await with DataReader ? ( without middle buffers!)
[英]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.