gpt4 book ai didi

c# - 与 Dapper 并行执行多个查询

转载 作者:行者123 更新时间:2023-12-04 15:42:16 28 4
gpt4 key购买 nike

我尝试使用 Dapper 和存储过程并行执行三个类似的 SQL 查询,以在所有查询完成后获得三个类似的结果。

这是我的代码:

public class SomeReport
{
private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["SomeContext"].ToString();
public ReportStatus ReportStatus { get; set; }
public long NetworkServerTime { get; set; }
public string ReportLastErrorMessage { get; set; }

public RowSet[] FirstRowSet { get; set; }
public RowSet[] SecondRowSet { get; set; }
public RowSet[] ThirdRowSet { get; set; }

public Report()
{
NetworkServerTime = 0;
ReportStatus = ReportStatus.NotCreated;
}


public async Task GetReportDataAsync(ReportParameters parameters)
{
DynamicParameters requestParameters = new DynamicParameters();
requestParameters.Add("@sinceDateFilter", parameters.SinceDate?.Date, DbType.DateTime);
requestParameters.Add("@untilDateFilter", parameters.UntilDate?.Date, DbType.DateTime);
requestParameters.Add("@countryId", parameters.CountryId, DbType.Int32);

ReportLastErrorMessage = null;

Task allTasks = null;
var stopWatch = new Stopwatch();

try
{
var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters);
var secondTask =
GetRows("[dbo].[GET_Report_SecondRowSet]", requestParameters);
var thirdTask =
GetRows("[dbo].[GET_Report_ThirdRowSet]", requestParameters);

allTasks = Task.WhenAll(firstTask, secondTask, thirdTask);

FirstRowSet = await firstTask;
SecondRowSet = await secondTask;
ThirdRowSet = await thirdTask;
}
catch (Exception ex)
{
ReportStatus = ReportStatus.Error;
ReportLastErrorMessage = allTasks?.Exception?.InnerExceptions.Last().Message;
}
finally
{
if (ReportStatus != ReportStatus.Error)
{
ReportStatus = ReportStatus.Success;
NetworkServerTime = stopWatch.ElapsedMilliseconds;
}

}
stopWatch.Reset();
}

private async Task<RowSet[]> GetRows(string procName, DynamicParameters parameters)
{
using (var conn = new SqlConnection(ConnectionString))
{
RowSet[] rowsSet;

try
{
var sqlString = string.Concat(procName, " @sinceDateFilter, @untilDateFilter, @countryId");
var query = await conn.QueryAsync<RowSet>(sqlString, parameters, commandTimeout: 500);
rowsSet = query.ToArray();
}
catch (SqlException sqlEx)
{
rowsSet = new RowSet[0];
throw;
}

return rowsSet;
}
}
}

但是当我启动调试器和 SQL Server Profiler 时,我看到在创建与它们对应的任务时查询是按顺序执行的。

如何让查询同时开始运行并并行运行?

最佳答案

if I use debugger and sql-profiler, I see that the first query in the profiler is executed when I am on the line of code var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters); but not when i am on the line of code allTasks = Task.WhenAll (firstTask, secondTask, thirdTask);



这是正确和正常的。方式 async/ await有效的是,只要第一个不完整的 await 控制权就会返回调用堆栈。发生,在你的情况下是 await conn.QueryAsync<RowSet> .但是,您仍然只是通过调用 async 方法开始了滚动。操作不会保持在某个挂起状态等待您调用 Task.WhenAll ,所以我们 期待 它已经开始了。 Task.WhenAll除了聚合 之外什么都不做等待 step - 它在使事情真正发生方面没有任何作用。

所以:我怀疑一切都已经按预期工作,但很简单:任务报告为按照您要求的顺序开始。这就是……正是我们所期望的。

关于c# - 与 Dapper 并行执行多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com