我有以下两种方法,它们产生相同的结果。
public static async Task<IEnumerable<RiskDetails>> ExecuteSqlStoredProcedureSelect<T>(IEnumerable<AccountInfo> linkedAccounts, string connectionString, string storedProcedure, int connTimeout = 10)
{
var responseList = new List<RiskDetails>();
using (IDbConnection conn = new SqlConnection(connectionString))
{
foreach (var account in linkedAccounts)
{
var enumResults = await conn.QueryAsync<RiskDetails>(storedProcedure,
new { UserID = account.UserID, CasinoID = account.CasinoID, GamingServerID = account.GamingServerID, AccountNo = account.AccountNumber, Group = account.GroupCode, EmailAddress = account.USEMAIL },
commandType: CommandType.StoredProcedure);
if (enumResults != null)
foreach (var response in enumResults)
responseList.Add(response);
}
}
return responseList;
}
public static async Task<IEnumerable<RiskDetails>> ExecuteSqlStoredProcedureSelectParallel<T>(IEnumerable<AccountInfo> linkedAccounts, string connectionString, string storedProcedure, int connTimeout = 10)
{
List<Task<IEnumerable<RiskDetails>>> tasks = new List<Task<IEnumerable<RiskDetails>>>();
var responseList = new List<RiskDetails>();
using (IDbConnection conn = new SqlConnection(connectionString))
{
conn.Open();
foreach (var account in linkedAccounts)
{
var enumResults = conn.QueryAsync<RiskDetails>(storedProcedure,
new { UserID = account.UserID, CasinoID = account.CasinoID, GamingServerID = account.GamingServerID, AccountNo = account.AccountNumber, Group = account.GroupCode, EmailAddress = account.USEMAIL },
commandType: CommandType.StoredProcedure, commandTimeout: 0);
//add task
tasks.Add(enumResults);
}
//await and get results
var results = await Task.WhenAll(tasks);
foreach (var value in results)
foreach (var riskDetail in value)
responseList.Add(riskDetail);
}
return responseList;
}
我对ExecuteSqlStoredProcedureSelect
执行的理解如下:
- 执行账户#1的查询
- 等待查询#1的结果
- 接收查询#1的结果
- 执行账户#2的查询
- 等待查询#2的结果
- 等等。
我对ExecuteSqlStoredProcedureSelectParallel
执行的理解如下:
- 将所有任务添加到IEnumerable实例中
- 调用
Task.WhenAll
,它将开始执行账户#n的查询 - 相对并行地对SQL服务器执行查询
- 当所有查询都执行完毕时,Task.WhenAll返回
据我了解,ExecuteSqlStoredProcedureSelectParallel
在时间方面应该有一些改进,但目前还没有。
我的理解是错误的吗?
catch
块中抛出完全相同的异常,那么捕获异常有什么意义呢? - FCincatch {throw;}
在所有情况下都是毫无意义的;无论其他层如何处理异常。既然没有处理异常的意义,那么完全可以直接删除try/catch,不会有任何变化。 - FlaterTask<IEnumerable<RiskDetails>>
更改为Task<IList<RiskDetails>>
,以明确表明任务的结果是一个实体集合,而不是一个延迟枚举。 - Theodor Zoulias