BlockingCollection или Queue <T>для рабочих мест? - PullRequest
9 голосов
/ 23 августа 2011

Я занимаюсь разработкой приложения для форм Windows (c #), и пока программа работает, она создает объекты и добавляет их в список.Я должен обработать элементы в списке с помощью FIFO (сначала в порядке, потом вышел).Я хочу сделать это в фоновом режиме, и я должен обработать их в порядке, номер 1, номер 2, номер 3 и так далее.И как только элемент добавляется в список, я хочу обработать его.Поэтому мне нужно кое-что проверить в этом списке.

Каков наилучший способ добиться этого?

Я знаю, что blockingcollection делает нечто похожее, что он ожидает добавления элемента перед его обработкой.

Я могуиспользовать один поток с очередью и просто while (true) и брать элементы, если они есть?

Что вы думаете?

Ответы [ 2 ]

15 голосов
/ 23 августа 2011

Похоже, вы должны пойти на BlockingCollection<T>, если вы планируете использовать фоновый поток.Вы можете довольно легко выполнить ту же логику while(true), что и искали.

BlockingCollection<T> предоставляет вам две важные функции

  1. Это поточно-ориентированный

  2. Когда вы звоните Take(), он будет блокировать (то есть ждать, пока что-то окажется в очереди), поэтому вам не нужно писать кодс ManualResetEvents и т.п., что является хорошим упрощением.

0 голосов
/ 23 августа 2011

Если вы хотите заблокировать, если очередь пуста, тогда используйте BlockingCollection - это идеально ... Если вы хотите, чтобы это было больше похоже на очередь (решите сами, как бороться с пустым), то ConcurrentQueue.

И то и другое поточно-ориентировано, в ConcurrentQueue большинство операций реализовано без блокировки, поэтому очень быстро ... в любом случае используйте его напрямую или в качестве базового типа для вашего BlockingCollection, например BlockingCollection<string> = new BlockingCollection<string> (new ConcurrentQueue<string>) - вы даже можете укажите максимальную емкость (необязательный второй параметр конструктора).

...