Использование очереди в многопоточной ситуации в C # - PullRequest
0 голосов
/ 25 июня 2010

Я только что узнал о очередях в .NET , и у меня есть несколько вопросов.

Допустим, я создаю приложение, которое загружает HTML-кодстраниц, а затем обрабатывает его.Вот как я хочу, чтобы он работал:

  1. Основной поток добавляет URL-адреса в очередь
  2. Эта очередь читается двумя другими потоками.Они «удаляют» URL-адрес и затем загружают соответствующий HTML.
  3. Затем HTML отправляется обратно в основной поток.
  4. Когда HTML попадает в основной поток, он помещается в другой поток.очередь, обработанная еще двумя потоками.Эти потоки обрабатывают HTML.
  5. Результаты обработки возвращаются в основной поток.

Как я могу реализовать такой сценарий без возможностиусловие гонки?

Кроме того, каков наилучший способ передачи информации между очередями и потоками, как описано выше?

Не могли бы вы дать мне пример кода ?

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 июня 2010

Я рекомендую BlockingCollection<T>. Он представляет «очередь производителя / потребителя», распространенную в многопоточности.

0 голосов
/ 25 июня 2010

Есть два способа, которые приходят на ум.

Первый - это использовать коллекцию, которая реализует блокировку, чтобы создать потокобезопасную согласованность (такую ​​как BlockingCollection, как упомянуто в другом месте).

Второйзаключается в использовании неизменяемой коллекции (например, описанной Эриком Липпартом в http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx), которая, во-первых, позволяет избежать большинства проблем с блокировкой потоков и условиями гонки и обычно делает то, что осталось, немного более очевидным..

...