Как правильно делать потоки? - PullRequest
0 голосов
/ 08 июля 2011

Я изучал потоки .Net и узнал о классах Threading.Task и Threading.Task.Parallel. Прямо сейчас, используя метод ForEach класса Parallel, я обрабатываю каждый объект в отдельном потоке. Однако я полагаю, что метод ForEach ожидает завершения всех потоков, прежде чем он вернется. Это приводит к тому, что те темы, которые заканчиваются раньше, чем другие, бездействуют. Я хочу, чтобы эти темы работали постоянно. Вот что я надеюсь сделать:

У меня есть поток A, отвечающий за выделение фрагмента из таблицы и запуск n рабочих потоков для обработки каждой записи.

  1. Каждый раз, когда рабочий поток завершает свою работу, он должен запросить у потока A следующую запись для обработки.

  2. При выделении записей рабочим потокам, если поток A заканчивается, он должен вернуться к базе данных и извлечь еще. Я предполагаю, что этот процесс распределения должен быть заключен в блок критической секции.

Может кто-нибудь указать мне учебник, который соответствует моему сценарию?

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Для сценария потребителя-производителя вы можете использовать ConcurrentQueue , который уже поточно-ориентирован.

Это означает, что вы можете заполнить его из любого потока A и выдвигать элементы для работыиз всех других пользовательских потоков без использования блокировки.

1 голос
/ 08 июля 2011

То, что вы обсуждаете, обычно называется «пул потоков». MSDN "Как: использовать пул потоков" , вероятно, будет соответствовать вашим интересам.

...