2010-10-14 82 views
1

我正在使用System.Threading.Tasks.Parallel.For來做一些重量級處理。Parallel.For與空對象同步

我的代碼是:

int count = 10; 
List<MyObj> results = new List<MyObj>(); 

Parallel.For(0, count, (index) => 
{ 
    MyObj obj = GetMyObjMaybe(); 

    if (obj != null) 
     results.Add(obj); 
}); 

if (results.Contains(null)) 
{ 
    //break here, and it does 
} 

//sometimes contains null objects 
return results; 
} 

我不希望是在名單越來越空,但我。我必須在某種程度上拙劣地使用index。有任何想法嗎?

+0

'results.Add(c)'中的'c'是什麼? – 2010-10-14 18:54:06

+0

是的,謝謝。固定。 – bufferz 2010-10-14 18:55:51

回答

6

您的List<MyObj> results不是線程安全。

您正在看到空值,因爲results在很多方面可能無效。

使用Thread-safe collection class或使用lock聲明保護您自己對results的每次訪問。

+0

謝謝你,亨克。我認爲列表至少會對於併發添加是線程安全的。一個簡單的鎖對象解決了這個問題。再次感謝。 – bufferz 2010-10-14 19:00:12

+0

「你可以在5分鐘內接受答案。」 -所以。我會回來的:P – bufferz 2010-10-14 19:00:49

+0

@bufferz - 一般來說,假設集合**對於併發讀取可能是安全的,但是它們幾乎從不可安全用於併發寫入或混合讀取/寫入。然後在文檔中檢查你的假設。 – 2010-10-14 19:20:03