C # Советы по организации очередей - PullRequest
0 голосов
/ 22 марта 2011

Я ищу совета по проекту, который мне назначен, и я ищу, как это делается «профессионально», или какие-либо предложения, которые могут привести меня в правильном направлении.

У меня есть серверная часть, которая принимает команды от клиентов и выталкивает потоки байтов на последовательный порт. Хотя несколько клиентов могут отправлять команды этому серверу, наше оборудование может обрабатывать только одну команду за раз. Моя проблема с очередями в конце программного обеспечения.

Я реализовал вспомогательный класс Queue<T>, который также вставляет данные в набор данных, содержащий: номер запрашивающего клиента, данные сообщения (байтовый массив для записи в последовательный порт) и тип сообщения (описание команды). В нем также будут перечислены команды очереди в DataGrid (в форме). Возможно, это не тот путь, но я могу думать только о том, чтобы сохранить запрашивающего клиента и данные и визуально показать очередь.

Где я могу обработать очередь? Я думал об обработке этого события в пользовательском событии, когда, если список DataGrid изменился (элемент добавлен / удален), захватите первую строку данных в наборе данных и отправьте ее на последовательный порт.

Любые комментарии или предложения приветствуются.

Спасибо.

Редактировать: я забыл добавить, что он также требует ответа от SerialPort для удаления текущей выполненной команды из очереди.

Ответы [ 3 ]

0 голосов
/ 22 марта 2011

Клиентские запросы могут поступать в любое время, они, вероятно, будут обрабатываться некоторым прокси-классом (WCF?) В своем собственном потоке / задаче.Затем этот поток / задача должна координироваться с задачей, которая находится «внутри» модели, фактически обрабатывающей запросы.

Хорошим классом для этого является BlockingCollection .

Серверный поток будет блокироваться, пока в коллекции не будет что-то для работы.Затем он может взять его из коллекции безопасным для потока способом и обработать.Выполнение этого гарантирует, что запросы могут быть приняты, когда они поступят, но они обрабатываются одновременно.

Общая модель, о которой следует здесь думать, - производитель-потребитель.

GJ

0 голосов
/ 22 марта 2011

Если это веб-приложение с высокой интенсивностью транзакций, возможно, вы захотите взглянуть на систему очередей, такую ​​как MSMQ , Очередь Service Broker * или RabbitMQ . Затем оконная служба может забрать элементы в очереди и отправить их на последовательный порт.

0 голосов
/ 22 марта 2011

Я бы использовал таблицу базы данных для хранения очереди команд.Веб-приложение добавит записи в очередь и отобразит ее, затем отдельный процесс (например, служба Windows или консольное приложение) запросит следующую команду из базы данных и отправит ее на последовательный порт.

...