2 回答
TA贡献1803条经验 获得超6个赞
如果我使用调试器和 sql-profiler,我会看到探查器中的第一个查询是在我位于代码行时执行的,
var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters);
但不是在我位于代码行时执行的allTasks = Task.WhenAll (firstTask, secondTask, thirdTask);
这是正确且正常的。async
/ 的工作方式await
是,一旦发生第一个不完整的await
情况,控制权就会返回调用堆栈,在您的情况下是await conn.QueryAsync<RowSet>
. 但是,您仍然只需通过调用 async 方法即可开始工作。该操作不会处于某种挂起状态等待您调用Task.WhenAll
,因此我们预计它已经开始。除了聚合等待Task.WhenAll
步骤之外,不执行任何操作- 它在使事情实际发生方面没有任何作用。
所以:我怀疑一切都已经按预期工作,但简单地说:任务报告为按照您请求的顺序开始。这正是我们所期望的。
TA贡献1804条经验 获得超8个赞
因为所有任务都已在减速时间运行。当您从返回的 GetRow 方法分配任务时,您已经让它开始了。然后使用 Task.WhenAll 创建一个新任务,当所有子任务完成时,该任务将返回已完成。但你也没有等到这个任务。
这样就保证了当三个任务完成时用await关键字执行完成。
如果您可以用一个单独的任务包装所有执行,您可以像这样并行调用所有执行
var queries = new[] {
"[dbo].[GET_Report_FirstRowSet]",
"[dbo].[GET_Report_SecondRowSet]",
"[dbo].[GET_Report_ThirdRowSet]"
};
var tasks = queries.Select(query => new Task(()=>{
return GetRows(query, requestParameters);
})).ToArray();
Task.WaitAll(tasks);
- 2 回答
- 0 关注
- 190 浏览
添加回答
举报