В последнее время я занимаюсь некоторой работой с 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, который будет собирать эти сообщения? Есть ли что-то еще, что мне не хватает здесь, что может принести пользу архитектуре этой системы?
