我一直在使用 Azure Functions 中的 C# 創建服務。我已閱讀有關如何最佳使用 async/await 的指南,但不了解其在 Azure 函式背景關系中的價值。
在我的 Azure 函式中,我對外部 API 進行了 3 次呼叫。我嘗試使用 async/await 來啟動我的 API 呼叫。這個想法是前兩個任務各自回傳一個串列,這些串列將被連接起來,然后與第三個串列進行比較。
這個比較完成后,所有的專案然后被發送到一個存盤容器佇列,由另一個使用佇列觸發器的函式處理。
我的異步實作如下:
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
var completed = await Task.WhenAll(firstListTask, secondListTask);
var resultList = completed[0].Concat(completed[1]);
var compareList = await thirdListTask;
// LINQ here to filter out resultList based on compareList
運行上面的代碼,我得到大約 38 秒的執行時間。我對異步實作的理解是,我啟動了所有 3 個異步呼叫來獲取我的串列。
- 等待前兩個任務
'await Task.WhenAll...'- 此時執行緒退出異步方法并“做其他事情”,直到 API 回傳有效負載 - 接收到 API 負載,然后恢復該方法并繼續執行下一條指令(連接兩個串列)
- 然后等待第三個任務
'await thirdListTask',它退出異步方法并“做其他事情”,直到 API 回傳有效負載 - 接收到 API 負載,然后恢復該方法并繼續執行下一條指令(過濾串列)
現在,如果我同步運行相同的代碼,我會得到大約 40 秒的執行時間:
var firstList = GetResourceList(1)
var secondList = GetResourceList(2);
var resultList = firstList.Concat(secondListTask)
var compaireList = GetOtherResourceList(1);
var finalList = // linq query to filter out resultList based on compareList
我可以看到,異步函式運行2秒比同步功能更快,我假定這是因為thirdListTask被在同一時間拉開序幕firstListTask和secondListTask?
我對異步實作的問題是我不明白在 Azure Functions 的背景關系中“做其他事情”意味著什么。根據我的理解,除了下一行的操作之外別無他法,但在有效載荷從 API 回傳之前,它無法在那里進行。
此外,以下代碼示例是否與我的第一個異步實作做同樣的事情?看到 Azure Functions 的示例對每個異步呼叫使用 await,只是為了等待下一行中的另一個呼叫,我感到非常困惑。
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
// LINQ here to filter out resultList based on compareList
我已經嘗試閱讀 Azure Functions 的 MS 最佳實踐以及有關 stackoverflow 上 async/await 的類似問題,但我似乎無法理解上述內容。任何人都可以幫助簡化這個嗎?
uj5u.com熱心網友回復:
var firstListTask = GetResourceListAsync(1);
var secondListTask = GetResourceListAsync(2);
var thirdListTask = GetOtherResourceListAsync(1);
這將啟動所有 3 個任務。所有 3 個 API 呼叫現在都在運行。
var completed = await Task.WhenAll(firstListTask, secondListTask);
此異步等待直到兩個任務完成。它釋放執行緒去“做別的事情” 這是什么別的東西?無論框架需要它是什么。這是一個被釋放的資源,因此它可以用于運行另一個異步操作的延續等。
var compareList = await thirdListTask;
在這一點上,您的 API 呼叫很可能已經完成,因為它是從其他 2 個開始的。如果完成,await如果任務出現故障,將拉出值或拋出例外。如果它仍在進行中,它將異步等待它完成,釋放執行緒“去做其他事情”
var firstList = await GetResourceListAsync(1);
var secondList = await GetResourceListAsync(2);
var resultList = firstList.Concat(secondList);
var compareList= await GetOtherResourceListAsync(1);
這與您的第一個示例不同。例如,如果您的所有 API 呼叫需要 5 秒才能完成,則總運行時間將為 15 秒,因為您依次啟動并等待它完成。在您的第一個示例中,總運行時間大約為 5 秒,因此快了 3 倍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313772.html
