У меня есть данные, которые необходимо выполнить на определенном фоновом потоке. У меня есть код, исходящий из всех других потоков, которые нужно вызвать в этом. у кого-нибудь есть хороший учебник или лучшая практика о наличии очереди для синхронизации для поддержки этого требования к потоку.
Лучший пример очереди/наилучшая практика
Ответ 1
Вы можете:
- реализует модель производителя/потребителя (которые не являются потокобезопасными общая очередь)
- или используйте в фоновом потоке синхронизируемую очередь , которая комментирует процесс перечисления через коллекцию.
Ответ 2
Отъезд Threading in С#, Джозеф Альбахари, очень полная ссылка на многопоточность. В частности, он описывает очереди производителей/потребителей.
Ответ 3
Это интересная статья о ThreadPools:
Для более простых случаев использования вы также можете использовать собственный класс ThreadPool.Net.
Ответ 4
Одно из моих любимых решений этой проблемы похоже на шаблон producer/consumer
.
Я создаю основной поток (в значительной степени моя программа Main()
), которая содержит объект блокирующей очереди.
Этот главный поток объединяет несколько рабочих потоков, которые простукивают от центральной блокирующей нити и обрабатывают их. Поскольку это потоковая блокировка очереди, биты синхронизации просты - вызов TaskQueue.Dequeue()
будет блокироваться до тех пор, пока задание не будет выделено производителем/основным потоком.
Вы можете динамически управлять количеством желающих или исправлять их в соответствии с конфигурационной переменной - поскольку все они просто выкидывают вещи из очереди, количество рабочих не добавляет никакой сложности.
В моем случае у меня есть служба, которая обрабатывает несколько различных типов tasks
. У меня есть очередь, набранная для обработки чего-то общего типа TaskQueueTask
. Затем я подклассифицирую это и переопределяю метод Execute()
.
Я также пробовал подход .NET threadpool, в котором вы можете легко выбросить вещи в пул. Он был чрезвычайно прост в использовании, но также обеспечивал небольшой контроль и не гарантировал порядок выполнения, время и т.д. Он рекомендовал только для легких задач.
Ответ 5
Вы можете попробовать это решение. Он показывает, как реализовать шаблон производителя-потребителя. Имеет также некоторое объяснение того, что с ним можно сделать. Как и разные комбинации числа производителей и потребителей.