2014-06-16 5 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 개 항목이, 나는 데이터베이스에서 가져 가라. 각각의 노드에 대해 하나의 조각을 crete하고 싶습니다. 그래서 나는 parallel.foreach를 사용하고 싶습니다.

parallel.Foreach에서 dbContext.Piezas에 새 조각을 추가하려고하면 컬렉션이 수정되었음을 알리는 예외가 발생하기 때문에 보조 목록 인 lstPiezasNuevas를 사용합니다. 그래서 나는 보조 목록을 사용한다.

그러나 문제는 내가 parallel.Forach lstPiezasNuevas에만 813 항목을 가지고 있지만, 나는 864가있을 것입니다. 때로는 여러 번 방법을 실행하면 805을 가지고 다른 경우에는 다를 수 있지만 나는 항상 모든 아이템을 얻는다는 보안을 가지고 있지 않다.

왜? 내가 잘못하지 않았다면, 평행선. 원본 목록의 모든 항목을 처리하고, 나는 모든 부분을 갖게됩니다. 그러나 그것은 사실이 아닙니다.

내 프로브에서 일반적인 foreach에 비해 성능이 향상되었음을 알 수 있으므로이 문제를 parallel.foreach로 해결하려고합니다.

+2

앞으로 코드를 멋지게 포맷하는 데 더 많은 노력을 기울이십시오. 아직 끝나지 않은 이유가 없습니다. 또한 List '은 스레드로부터 안전하지 않으므로 문제가 될 수도 있습니다 ... –

답변

3

concurrent collections (.NET 4)을 살펴보십시오. List<T>은 스레드로부터 안전하지 않습니다.

+0

고마워, System.Collections.Concurrent.BlockingCollection을 사용하면 정상적으로 작동합니다. 정말 고마워. –