2014-06-16 24 views
0

我有這樣的代碼:爲什麼我不創造所有的作品?

List<Piezas> lstPiezasNuevas = new List<Piezas>(); 
Parallel.ForEach(lstNodosDB, iteradorEstructuraPlantilla => 
{ 
    lstPiezasNuevas.Add(new Piezas() 
    { 
     FechaEstado = miFechaEstado, 
     HorasParcialesFallos = 0, 
     HorasParcialesFuncionamiento = 0, 
     HorasTotalesFallos = 0, 
     HorasTotalesFuncionamiento = 0, 
     IDComponente = iteradorEstructuraPlantilla.IDComponente, 

     //El estado por defecto al crear una pieza será no instalada. 
     IDEstado = 5, 

     NumeroSerie = null 
    }); 
}); 

dbContext.Piezas.AddRange(lstPiezasNuevas); 

lstNodosDB有864項,我把它從數據庫中。我想爲每個節點創建一塊,所以我想使用e parallel.foreach。

我使用了一個輔助列表lstPiezasNuevas,因爲如果在parallel.Foreach中,我嘗試將新的部分添加到dbContext.Piezas中,我得到一個異常,它說它被修改的集合。所以我使用一個輔助名單。

但問題是,當我完成parallel.Forach lstPiezasNuevas只有813項,但我會有864.如果我執行該方法很多次,有時我只有805,在其他情況下可以不同,但​​我沒有安全感,我總是得到所有的物品。

爲什麼?如果我沒有錯,parallel.Foerach會處理源列表中的所有項目,並且我會擁有所有項目。但事實並非如此。

在我的探測中,我可以注意到比正常的foreach更好的性能,所以我想嘗試用parallel.foreach來解決這個問題。

+2

請在將來做更多的努力來設計好代碼 - 沒有理由讓它成爲現實。另外請注意,'List '不是線程安全的,所以這可能是您的問題的一部分... –

回答

3

看看concurrent collections(.NET 4)。 List<T>不是線程安全的。

+0

謝謝,我使用System.Collections.Concurrent.BlockingCollection,它工作正常。非常感謝。 –

相關問題