2014-09-26 13 views
7

ja wa nie do utrzymania się lista kilku BlockingCollectionsJest listą <BlockingCollection <T>> Gwint bezpieczny?

List<BlockingCollection<ExtDocument>> a = new List<BlockingCollection<ExtDocument>>(); 

a zameldowanie subthreads jeśli któryś z „kolejek” jeszcze pozycje w oczekiwaniu:

if (a.Where(x => x.IsAddingCompleted).Count > 0) 

Czy korzystanie z List<T> w tym przypadku wątek bezpieczny , jeśli liczba pozycji na liście nie ulegnie zmianie po inicjalizacji (zawartość list blokujących wewnątrz kolekcji zmieni kurs ...)?

Albo powinienem zdecydować się na array of BlockingCollection lub następującej budowie:

BlockingCollection<BlockingCollection<workitem>> a = new BlockingCollection<BlockingCollection<workitem>>(); 
+7

Jeśli lista nie zmieni się po inicjalizacji, po prostu użyj listy. Tylko czytanie nie jest problemem w przypadku współbieżności, ale jego zmienność sprawia, że ​​ostatecznie staje się problemem. – Caramiriel

+6

Wolałbym użyć tablicy zamiast 'List '. W ten sposób jest bardziej przejrzyste, że liczba elementów się nie zmieni. – CodesInChaos

+0

@Caramiriel Dziękujemy za informacje! CodesInChaos: Dzięki za cynk. To rzeczywiście zwiększy czytelność dla przyszłych programistów – User999999

Odpowiedz

7

Miły korzyści z wykorzystaniem tablicy zamiast List<T> jest to, że można użyć BlockingCollection<T>.TakeFromAny i podobnych metod. Najprawdopodobniej zbliżasz się do swojego problemu z niewłaściwego punktu widzenia - twoje wątki przetwarzania mogłyby po prostu zrobić BlockingCollection<T>.TryTakeFromAny, a jeśli jest to fałsz, skończysz. Całkowicie bezpieczny dla wątków i dość dobrze działający. Tak więc pętla przetwarzania będzie wyglądała mniej więcej tak:

while (BlockingCollection<ExtDocument>.TryTakeFromAny(collections, out workItem) >= 0) 
{ 
    // Do work on workItem 
} 

// We're done! 
+0

Całkiem nieźle. Muszę to przeczytać na stronie msdn. Wkrótce go przetestuję! – User999999

+0

Rzeczywiście, o wiele lepiej niż kod, który miałem tak. Thnx! – User999999

Powiązane problemy