Производитель и потребитель с уведомлениями в C # - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть производитель (P), который продвигает товары потребителю (C).С может принять решение не употреблять все предметы сразу после их прибытия;вместо этого он может асинхронно ожидать, пока в очереди не будет n элементов, или пока не истечет определенный интервал времени t , а затем использовать все элементы в очереди и перезапустить таймер.

P нужно уведомлять всякий раз, когда предмет, который он выдвинул на C, действительно был использован.Это связано с тем, что P отвечает за восстановление в случае сбоя (P сохраняет текущее состояние в БД).Таким образом, в случае перезапуска P необходимо знать, какие элементы ему нужно нажать еще раз, поскольку они не были подтверждены потребителем.

Моя первая идея состояла в том, чтобы C уведомлял P через функцию обратного вызова (делегат): всякий раз, когда элемент используется, функция обратного вызова P вызывается со списком использованных элементов.

Но яинтересно, могут ли быть другие (лучшие) способы уведомления производителя.Что вы думаете?

Стефано

ОБНОВЛЕНИЕ : спасибо за ваши ответы до сих пор.В настоящее время я изучаю, может ли использование асинхронных методов быть элегантным способом синхронизации издателя и потребителя по состоянию публикуемых элементов.

Ответы [ 5 ]

4 голосов
/ 07 апреля 2011

Я думаю, что вы можете достичь того, что вам нужно, не имея C уведомляя P, но используя транзакционную очередь для подачи C. Просто пример ссылки, говорящей о реализации MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx, или, если MSMQ недоступен, чистые решения BCL могут быть:

https://rhino -tools.svn.sourceforge.net / svnroot / rhino-tools / branch / rhino-queues-1.0 / (или, по крайней мере, просто чтобы получить какую-то идею)

EDIT Я изменил ссылку на более официальную ссылку о решении MSMQ.

1 голос
/ 07 апреля 2011

Я бы продлил предмет, чтобы бросить CosumedEvent. P регистрируется на это событие. Когда C потребляет элемент, P получает уведомление и ему просто нужно отсоединить обработчик события плюс операции, которые он должен выполнить, когда элемент был израсходован.

1 голос
/ 07 апреля 2011

Лично не знает ничего слишком фантастического - вы можете использовать событие, или продюсер может реализовать INotifyProcessComplete вашего дизайна, который вы передаете потребителю, или вы можете использовать событие (например, ManualResetEvent), которое потребительские наборы / флаги, когда он закончен.

1 голос
/ 07 апреля 2011

С делегатом все в порядке, хотя я бы использовал событие для его реализации.

0 голосов
/ 11 апреля 2011

В итоге я реализовал Асинхронный дизайн (то есть, создал пару методов BeginXXX и EndXXX на интерфейсе производитель / потребитель), поскольку я считаю, что это более идиоматично дляРазработка .NET (я ожидаю, что любой будущий разработчик этого кода будет знаком с ним).

Когда потребитель завершит обработку элемента, он вызывает обратный вызов согласно шаблону;Клиент может либо синхронизировать обратный вызов, либо использовать другие шаблоны взаимодействия через IAsyncResult (см. Документацию MSDN).

...