2014-09-21 56 views
1

我來自Threading with Parallel.For Adding Lists。對於鏈接中的例子,兩個線程用於調用Parallel.Invoke,這仍然很慢,所以我想在循環內部執行一些多線程,假設我不在意訂單項被添加。 但parallel.for沒有作爲expecetd工作,並給出indexofRange異常。 有人PLZ的幫助?如何使用parallel.for將項目添加到列表

private static void Main(string[] args) 
{ 
    var dict1 = new Dictionary<int, string>(); 
    var dict2 = new Dictionary<int, string>(); 
    Stopwatch s = Stopwatch.StartNew(); 
    Parallel.Invoke(() => FillDictionary(dict1, 10000000),() => FillDictionary(dict2, 10000000)); 
    //FillDictionary(dict1, 10000000); 
    //FillDictionary(dict2, 10000000); 
    Console.WriteLine("test"); 
    Console.WriteLine(s.Elapsed.TotalMilliseconds); 
    Console.ReadLine(); 
} 
private static void FillDictionary(Dictionary<int, string> toFill, int itemCount) 
{ 
    //for (int i = 0; i < itemCount; i++) 
     //toFill.Add(i, "test" + i); 
    Parallel.For(0, itemCount, (i) => toFill.Add(i, "test" + i));  
} 
+0

其實我以爲也許使用parallel.for不是線程安全的。 – baozi 2014-09-21 18:20:13

回答

4

Dictionarythread safe。使用ConcurrentDictionary<TKey, TValue>代替。

+0

它現在有效。還有一件事,考慮到我的例子迭代2 * 10萬循環它拋出了內存異常。爲什麼發生? – baozi 2014-09-21 18:30:24

+0

,因爲你沒有足夠的內存(RAM) – 2014-09-21 18:34:23

+0

我不這麼認爲。我有4 * 8GB內存,只用了三分之一。 – baozi 2014-09-21 18:38:01