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 關注
- 252 瀏覽
添加回答
舉報