2013-07-03 11 views
2

Все -Взаимодействие данных в реальном времени

У меня есть проект POC WPF, который работает от конца до конца. Приложение имитирует рыночные данные в реальном времени, публикуемые через библиотеку (Publisher), а мой клиент WPF - это Subscriber (имеет метод обработчика). Он использует пользовательские события для публикации данных.

Вопрос у меня есть это:

1) Я хочу осуществить Производитель Потребитель - поэтому мой обработчик не тянет данные в коллекцию непосредственно наблюдаемую.

2) Я точно знаю, как реализовать фрагменты Producer/Consumer C# (http://msdn.microsoft.com/en-us/library/hh228601.aspx), но хотел бы больше понять, как это будет соответствовать моей нынешней архитектуре. Вот диаграмма

3) Может ли кто-нибудь помочь мне с кодом подход, ссылки и т.д.

enter image description here

MainWindowViewModel.cs

public class MainWindow_VM : ViewModelBase 
{ 
    #region Properties 
    public myCommand SbmtCmd { get; set; } 
    public ObservableCollection<StockModel> stocks { get; set; } 
    #endregion 

    #region Fields 
    private readonly Dispatcher currentDispatcher; 
    #endregion 

    public MainWindow_VM() 
    { 
     SbmtCmd = new myCommand(mySbmtCmdExecute, myCanSbmtCmdExecute); 
     currentDispatcher = Dispatcher.CurrentDispatcher; 
     stocks = new ObservableCollection<StockModel>(); 
    } 

    private void mySbmtCmdExecute(object parameter) 
    { 
     MarketDataProvider p = new MarketDataProvider(); 
     p.OnMarketData += new EventHandler<MarketDataEventArgs>(handlermethod);  
     p.GenerateMarketData(); 
    } 

    private bool myCanSbmtCmdExecute(object parameter) 
    { 
     return true; 
    } 


    // Subscriber method which will be called when the publisher raises an event 

    private void handlermethod(object sender, MarketDataEventArgs e) 
    { 
     foreach (Stock s in e.updatedstk) 
     { 
      StockModel sm = new StockModel(); 

      sm.symbol = s.symbol; 
      sm.bidprice = s.bidprice; 
      sm.askprice = s.askprice; 
      sm.lastprice = s.lastprice; 

      currentDispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() 
      { 
       if (sm != null) 
       { 
        if (stocks.Any(x => x.symbol == sm.symbol)) 
        { 
         var found = stocks.FirstOrDefault(x => x.symbol == sm.symbol); 
         int i = stocks.IndexOf(found); 
         stocks[i] = sm; 
        } 
        else 
        { 
         stocks.Add(sm); 
        } 
       } 
      }); 
     } 
    } 
} 
+0

Прочитать http://msdn.microsoft.com/en-us/data/gg577611 – JSJ

+0

Спасибо Jodha - к сожалению, у меня есть ограничения на использование среды .Net 3.5 и, следовательно, необходимо решить эту проблему с использованием традиционных подходов C# – Patrick

+0

Тогда вы также не можете использовать DataFlow. Он доступен только в .NET 4 и выше, в то время как активные версии доступны для 3.5 –

ответ

1

я сделал несколько проектов с рынка кормов и ваша диаграмма выглядит красиво концептуально. Чтобы избежать проблем с масштабируемостью или разрабатывать проактивные проблемы с масштабируемостью, вы можете подумать о том, чтобы сделать ваш блок производителя/потребителя несколько экземпляров для размещения нескольких каналов и/или нескольких инструментов в фиде. Если, например, данный рынок становится плотно изменчивым, вы не хотите, чтобы все другие инструменты были голодны для данных.

Кроме того, некоторым людям нравится переключать каналы для данного инструмента на основе произвольных критериев, например, получать YEN из Лондона до фиксации золота, а затем переключиться на NYC, а затем снова переключиться на Токио.

Другая вещь, которую я могу упомянуть, заключается в том, что стрелка выходит из окна производителя/потребителя, чтобы передать только POCO DTO. Это добавляет ценность вашего приложения, а также упрощает тестирование изоляции.

Тестирование автономных каналов (или даже симулированных каналов) маловероятно, потому что они не захватывают все условия, которые необходимо протестировать, прежде чем приложение будет развернуто.

Наконец, я хотел бы упомянуть, что шаблон производителя/потребителя был реализован начиная с .NET 4.0 с пространством имен System.Collections.Concurrent ... http://msdn.microsoft.com/en-us/library/dd287147.aspx Я использую эти классы в производстве, и они действительно справляются с необходимостью протестировать домашнюю модель дизайна.

1

Я создал инструментарий UI под названием ReactiveTables, который позволяет создавать живые таблицы, которые могут быть объединены, отфильтрованы, расширены с вычисленными столбцами и затем привязаны к элементам управления WPF. Таблицы предоставляют интерфейс IObservable и предназначены для повышения производительности.

Вы можете подключить таблицы непосредственно к своей реализации производителя/потребителя, а затем привязать их к вашим представлениям. Таблицы будут уведомлять об изменениях отдельных ячеек, и для этого можно использовать вспомогательный класс для событий INotifyPropertyChanged.

На стороне приема есть классы, которые могут дросселировать обновления таблиц пользовательского интерфейса и маршал формировать ваши потоки данных в поток пользовательского интерфейса.

+0

Спасибо Slugart - я это проверю – Patrick

Смежные вопросы