我们对此很陌生,但我们正在尝试使用新的异步数据加载器
中的示例但遇到问题。 我们要努力实现的目标是: - 存储的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;
}
然而,一旦我们点击任何等待,单步执行代码,应用程序只是加载,并且没有其他代码被击中..
对此提出任何建议或建议将不胜感激。
答案 0 :(得分:5)
异步部分是数据库I / O,这意味着当您正在等待打开或读取时,您的应用程序可以自由地执行其他操作而不是阻止数据库。
await / async允许您以顺序方式编写代码,即使部分可能需要一段时间。代码完全按照您的顺序流动,每个await
之后的行不会运行,直到等待的项目结束,但当前线程退回堆栈,以便它可以继续其他事情。
如果你想使用await / async一次做两件事,那么你需要将每个事件包装在一个返回Task
的函数中,就像传统的TPL一样。这样你就可以在不等待结果的情况下掌握任务,直到你想要。