В последнее время я занимаюсь некоторой работой с Reactive Framework и до сих пор очень люблю его. Я смотрю на замену традиционной очереди сообщений опроса некоторыми фильтрами IObservables для очистки моих операций с сервером. По-старому я имел дело с сообщениями, поступающими на сервер следующим образом:
// Start spinning the process message loop
Task.Factory.StartNew(() =>
{
while (true)
{
Command command = m_CommandQueue.Take();
ProcessMessage(command);
}
}, TaskCreationOptions.LongRunning);
Это приводит к потоку непрерывного опроса, который делегирует команды от клиентов методу ProcessMessage, где у меня есть ряд операторов if/else-if, которые определяют тип команды и работу делегата в зависимости от ее типа
Я заменяю это системой, управляемой событиями, с помощью Reactive, для которой я написал следующий код:
private BlockingCollection<BesiegedMessage> m_MessageQueue = new BlockingCollection<BesiegedMessage>();
private IObservable<BesiegedMessage> m_MessagePublisher;
m_MessagePublisher = m_MessageQueue
.GetConsumingEnumerable()
.ToObservable(TaskPoolScheduler.Default);
// All generic Server messages (containing no properties) will be processed here
IDisposable genericServerMessageSubscriber = m_MessagePublisher
.Where(message => message is GenericServerMessage)
.Subscribe(message =>
{
// do something with the generic server message here
}
Мой вопрос в том, что, хотя это работает, хорошо ли использовать блокирующую коллекцию в качестве поддержки для IObservable? Я не вижу, когда Take() когда-либо называется таким образом, что заставляет меня думать, что сообщения будут сбиваться в очереди, не удаляясь после их обработки?
Было бы более эффективным рассматривать объекты как коллекцию резервных копий для управления фильтром IObservables, который будет собирать эти сообщения? Есть ли что-то еще, что мне не хватает здесь, что может принести пользу архитектуре этой системы?