我在使用異步/等待時遇到了一些麻煩。我與具有以下代碼(簡化爲簡潔起見)現有的代碼庫幫助:如何將此Parallel.ForEach代碼轉換爲異步/等待
List<BuyerContext> buyerContexts = GetBuyers();
var results = new List<Result>();
Parallel.ForEach(buyerContexts, buyerContext =>
{
//The following call creates a connection to a remote web server that
//can take up to 15 seconds to respond
var result = Bid(buyerContext);
if (result != null)
results.Add(result);
}
foreach (var result in results)
{
// do some work here that is predicated on the
// Parallel.ForEach having completed all of its calls
}
我怎麼能這個代碼轉換爲異步代碼,而不是並行使用異步/等待?我受到一些非常嚴重的性能問題的困擾,我認爲這是使用並行方法處理多個網絡I/O操作的結果。
我已經嘗試了幾種方法,但我從Visual Studio獲得警告,我的代碼將同步執行,或者我無法使用await關鍵字以外的異步方法,所以我確信我只是缺少簡單一些。
編輯#1:我打開替代異步/等待以及。根據我的閱讀,這似乎是正確的方法。
編輯#2:此應用程序是一個Windows服務。它呼籲幾個「買家」要求他們競標一個特定的數據。在處理可以繼續之前,我需要全部出價。
您可以添加出價方法定義嗎?如果它是網絡相關的,它將真正有助於查看網絡代碼:) –
聽起來像是一個非常昂貴的呼叫在一個循環。你需要預先得到所有的結果嗎?您是否可以得到一些結果,並且只有在用戶要求更多時才返回更多? –
一個簡單的解決方案見http://stackoverflow.com/questions/9290498/how-can-i-limit-parallel-foreach。 – beerboy