【发布时间】:2018-05-28 06:34:09
【问题描述】:
我有以下两种方法,产生相同的结果。
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;
}
我对@987654322@如何执行的理解如下:
- 为帐户 #1 执行查询
- 等待查询 #1 的结果
- 接收查询 #1 的结果
- 对帐户 #2 执行查询
- 等待查询 #2 的结果
- 等
我对@987654323@如何执行的理解如下:
- 将所有任务添加到 IEnumerable 实例中
- 调用
Task.WhenAll,它将开始执行对帐户#n 的查询 - 查询相对于 SQL 服务器并行执行
- Task.WhenAll 在所有查询执行时返回
据我了解,ExecuteSqlStoredProcedureSelectParallel 这个功能在时间上应该会有一点改进,但目前没有。
我对此的理解有误吗?
【问题讨论】:
-
如果您在
catch块中抛出完全相同的异常,那么捕获异常有什么意义? -
@FCin 这与我的问题有什么关系?您是否能够查看其余应用程序代码以了解异常处理的方式/位置?
-
并行运行操作会产生开销,因此有时会抵消甚至超过所获得的任何收益。如果您的操作非常快,那么您可能看不到任何收益。如果每个操作需要 1 秒,但开销是 1 秒,那么串行或并行需要 2 秒。
-
我想知道并行在连接级别是如何工作的。单个连接不是线程安全的。如果您得到正确的结果,我怀疑您的查询正在排队,并且执行结果应该是相同的。
-
@monstertjie_za:你说得对,这与你提出的问题无关,但这是一个不必要的敌对回答。
catch { throw; }在所有情况下都是毫无意义的; 不管其他层如何处理异常。简单地完全删除 try/catch 并不会改变任何事情,因为没有必要捕获您无法处理的异常。
标签: c# sql .net asynchronous async-await