2010-10-14 2 views
1

Я использую System.Threading.Tasks.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

Что такое 'c' в' results.Add (c) '? –

+0

Да, спасибо. Исправлена. – bufferz

ответ

6

List<MyObj> results является не поточно-безопасный.

Вы видите нули, потому что results может быть недействительным разными способами.

Либо используйте Thread-safe collection class, либо охраняйте каждый доступ к results самостоятельно с помощью инструкции lock.

+0

спасибо, Хенк. Я думал, что List будет потокобезопасным для одновременного добавления как минимум. Проблема была решена простым объектом блокировки. Еще раз спасибо. – bufferz

+0

«Вы можете принять ответ за 5 минут». -ТАК. Я вернусь: P – bufferz

+0

@ bufferz - в общем случае предположить, что коллекции ** могут быть безопасными для одновременного чтения, но они почти никогда не безопасны для одновременной записи или смешанного чтения/записи. Затем проверьте свои предположения в документах. –

Смежные вопросы