2 回答

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

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