我想並行處理一個集合,但是我在實現它時遇到了問題,因此我希望得到一些幫助。與異步lambda平行的foreach
如果我想在並行循環的lambda內調用C#中標記爲異步的方法,則會出現問題。例如:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
與計數爲0時出現問題,因爲創建的所有線程都有效只是後臺線程和Parallel.ForEach
調用不會等待完成。如果我刪除async關鍵字,方法如下:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
它的工作原理,但它完全禁用等待聰明,我必須做一些手工異常處理。(除去簡潔)。
如何實現在lambda中使用await關鍵字的Parallel.ForEach
循環?可能嗎?
Parallel.ForEach方法的原型需要Action<T>
作爲參數,但我希望它等待我的異步lambda。
我假設你的意思是刪除'await'從'伺機的GetData(項目)'在你的第二個代碼塊,因爲它會產生一個編譯錯誤的-is。 – 2017-11-30 12:18:23
[Parallel.ForEach中嵌套等待]的可能重複(https://stackoverflow.com/questions/11564506/nesting-await-in-parallel-foreach) – 2017-12-02 20:57:50