Как управлять рабочими потоками, которые ждут, когда у них есть работа? - PullRequest
1 голос
/ 29 сентября 2010

У меня есть программа, которая выполняет следующие действия:

  1. Вызов веб-службы (много вызовов одной и той же веб-службы)

  2. Обработкарезультат 1.

  3. Вставить результат 2. в БД

Так что я думаю, что лучше сделать несколько многопоточности.Я думаю, что я могу сделать это так:

  • один поток является основным (назовем его A)

  • он создает некоторый поток, который вызываетвеб-сервисы (назовем это W)

  • когда у W есть какие-то результаты, он отправляет его A (или A обнаруживает, что у W есть какие-то вещи)

  • A отправляет результаты в какой-то вычислительный поток (назовем его C)

  • когда у C есть результаты, он отправляет его в A (или A обнаруживает, что у C есть какие-то вещи)

  • A отправляет результаты в какой-то поток базы данных (назовем его D)

Поэтому иногда C или D будут ждать выполнения работы.

С помощью этой техники я смогу установить номер потока для каждой задачи.

Подскажите, пожалуйста, как я могу это сделать, возможно, если есть какой-либо шаблон.РЕДАКТИРОВАТЬ: я добавил «некоторые» вместо «а», так что я создам много потоков для некоторого трудоемкого процесса, и, возможно, только один для самого быстрого.

Ответы [ 3 ]

4 голосов
/ 29 сентября 2010

Звучит так, будто вы могли бы использовать шаблон «производитель / потребитель».В .NET 4 это стало очень просто реализовать.Запустите число Task s и используйте BlockingCollection<T> в качестве буфера между задачами.Проверьте этот пост для деталей.

2 голосов
/ 29 сентября 2010

В .net у вас есть пул потоков.

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

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

0 голосов
/ 29 сентября 2010

Я бы запустил два таймера, которые будут запускать свои обработчики событий в отдельных потоках ThreadPool.Обработчик событий для первого таймера проверит данные на веб-службе, запишет их в Queue<T>, если найдет их, и затем вернется в спящий режим до следующего интервала.

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

Отдельные таймеры с независимыми интервалами позволят вам разъединять, когда доступны данные, от времени, которое требуется для их вставки в базу данных, сочередь выступает в качестве буфера.Так как общие очереди могут динамически расти, у вас будет немного места, даже если база данных будет недоступна какое-то время.Второй обработчик событий может даже порождать несколько потоков, чтобы вставлять несколько записей одновременно или в зеркальные базы данных.Обработчики событий также могут публиковать обновления в файле журнала или пользовательском интерфейсе, чтобы помочь вам отслеживать активность.

...