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)
然而,单步执行代码,只要我们等待任何等待,应用程序只需加载,并且不会再发出任何代码.
对此的任何建议或建议将不胜感激.
异步部分是DB I/O,这意味着当您正在等待打开或读取时,您的应用程序可以自由地执行其他操作而不是阻止数据库.
await/async允许您以顺序方式编写代码,即使部分可能需要一段时间.代码的流程与您按预期的顺序完全相同,每个代码行之后的行都await不会运行,直到等待的项目结束,但是当前的线程退回堆栈,以便它可以继续执行其他操作.
如果你想使用await/async一次做两件事,那么你需要将每个事件包装在一个返回Task传统TPL 的函数中.这样你就可以在没有等待结果的情况下保持任务,直到你想要.