2 回答

TA貢獻(xiàn)1803條經(jīng)驗 獲得超6個贊
如果我使用調(diào)試器和 sql-profiler,我會看到探查器中的第一個查詢是在我位于代碼行時執(zhí)行的,
var firstTask = GetRows("[dbo].[GET_Report_FirstRowSet]", requestParameters);
但不是在我位于代碼行時執(zhí)行的allTasks = Task.WhenAll (firstTask, secondTask, thirdTask);
這是正確且正常的。async
/ 的工作方式await
是,一旦發(fā)生第一個不完整的await
情況,控制權(quán)就會返回調(diào)用堆棧,在您的情況下是await conn.QueryAsync<RowSet>
. 但是,您仍然只需通過調(diào)用 async 方法即可開始工作。該操作不會處于某種掛起狀態(tài)等待您調(diào)用Task.WhenAll
,因此我們預(yù)計它已經(jīng)開始。除了聚合等待Task.WhenAll
步驟之外,不執(zhí)行任何操作- 它在使事情實際發(fā)生方面沒有任何作用。
所以:我懷疑一切都已經(jīng)按預(yù)期工作,但簡單地說:任務(wù)報告為按照您請求的順序開始。這正是我們所期望的。

TA貢獻(xiàn)1804條經(jīng)驗 獲得超8個贊
因為所有任務(wù)都已在減速時間運行。當(dāng)您從返回的 GetRow 方法分配任務(wù)時,您已經(jīng)讓它開始了。然后使用 Task.WhenAll 創(chuàng)建一個新任務(wù),當(dāng)所有子任務(wù)完成時,該任務(wù)將返回已完成。但你也沒有等到這個任務(wù)。
這樣就保證了當(dāng)三個任務(wù)完成時用await關(guān)鍵字執(zhí)行完成。
如果您可以用一個單獨的任務(wù)包裝所有執(zhí)行,您可以像這樣并行調(diào)用所有執(zhí)行
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 關(guān)注
- 269 瀏覽
添加回答
舉報