2011-07-01 13 views
5

jest to możliwe, że równolegle do każdego procesu pętli elementy w kolejce, tak że:równoległe ForEach i kolejki

  1. usuwa jedynie elementy, które są przetwarzane
  2. Wstrzymuje aż nowe elementy są dodawane do kolejki

EDIT: to jest w odniesieniu do funkcjonalności Parallel.ForEach System.Threading.Tasks'

+0

Sprawdź to pytanie też: http://stackoverflow.com/questions/6308225/tpl-architectural-question –

+0

Nah odpowiedź za które Pytanie jest zbyt skomplikowane. Programowanie reaktywne jest rozwiązaniem. –

Odpowiedz

8

Zapisz się do kolejki przy użyciu Reactive Extensions i wykonać każdy element w nowym zadaniu. Nie będziesz musiał blokować ani czekać na nowy produkt, ponieważ zostanie on przekazany do Twojej subskrypcji lambda, a twoje wykonanie/przetwarzanie będzie równoległe.

http://rxwiki.wikidot.com/101samples

+0

Rozszerzenia reaktywne Wygląda jak hot suff, dziękuję –

+0

Ok, więc to jest model programowania reaktywnego, a RX to jest jego implementacja. Dzięki Hasan –

0

myślę, że byłoby to możliwe, jeśli kolejka beton REALIZACJA nacja jest zsynchronizowana, zasadniczo jest to scenariusz konsumencko-producencki.

+0

Uh? Niestety, nie zrozumiałem tego w ogóle :( –

+0

Jeśli dobrze rozumiem twoje pytanie, chcesz powtórzyć tę samą kolejkę w 2 różnych dla każdej pętli w prawo ?, więc w zasadzie będziesz miał dwa wątki robiące każdy z nich dla każdej pętli, aby to działało, kolejka musiałaby obsługiwać synchronizację między wątkami –

+0

Przepraszam, że miałem na myśli funkcję System.Threading.Tasks "Parallel.ForEach" –

0

To brzmi jak mówisz klasycznym producenta/sytuacji konsumentów. Zawsze zaskakuje mnie, że nie ma bezpośredniego wsparcia dla tego modelu wbudowanego w .Net. Najbliższe, z jakimi spotkałem się w .Net, było kiedyś ukryte w środowisku wykonawczym współbieżności i koordynacji, które było częścią pakietu Microsoft Robotics. Powodzenia, znajdź to teraz.

Ale gdy wiesz, czego szukać, szybkie sprawdzenie Google robi podać kilka innych potencjalnych możliwości.

1

Zastosowanie BlockingCollection coś takiego:

var bc = new BlockingCollection<int>(); 
Task.Factory.StartNew(() => 
    { 
     ParallelOptions options = new ParallelOptions 
      { 
       MaxDegreeOfParallelism = 30 
      }; 
     Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { }); 
    }); 
+1

Zadanie będzie czekać, aż nowe elementy zostaną umieszczone w kolekcji, zanim będzie można kontynuować? –