【问题标题】:Real Time Data Binding实时数据绑定
【发布时间】:2013-07-03 15:04:01
【问题描述】:

全部 -

我目前有一个端到端工作的 POC WPF 项目。该应用程序模拟通过库(发布者)发布的实时市场数据,我的 WPF 客户端是订阅者(具有处理程序方法)。它使用自定义事件来发布数据。

我的问题是这样的:

1) 我想实现 Producer Consumer - 所以我的处理程序不会直接将数据拉入 Observable Collection。

2) 我确切知道如何实现生产者/消费者 C# sn-ps (http://msdn.microsoft.com/en-us/library/hh228601.aspx),但想更多地了解这将如何适合我当前的架构。这是一张图

3) 任何人都可以帮助我解决代码方法、链接等问题。

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);
                    }
                }
            });
        }
    }
}

【问题讨论】:

  • 感谢 Jodha - 不幸的是,我在使用 .Net 3.5 时存在环境限制,因此需要使用传统的 C# 方法解决此问题
  • 那你也不能使用DataFlow。它仅适用于 .NET 4 及更高版本,而反应式扩展适用于 3.5

标签: c# wpf


【解决方案1】:

我已经完成了一些使用市场供稿的项目,您的图表在概念上看起来不错。为了避免可扩展性问题,或针对可扩展性问题进行主动设计,您可以考虑让您的生产者/消费者框具有多个实例以容纳多个提要和/或提要中的多个仪器。例如,如果给定市场变得高度波动,您不希望所有其他工具都缺乏数据。

此外,有些人喜欢根据任意标准切换给定工具的提要,例如从伦敦获取日元直到黄金定价,然后切换到纽约,然后再次切换到东京。

我可以提到的另一件事是,从生产者/消费者框出来的箭头仅通过 POCO DTO。它增加了应用程序的价值,也使隔离测试变得更加容易。

很少对实时提要(甚至模拟提要)进行测试,因为它们没有捕捉到在应用可部署之前需要测试的所有条件。

最后我要提一下,生产者/消费者模式是在 .NET 4.0 中使用 System.Collections.Concurrent 命名空间实现的...http://msdn.microsoft.com/en-us/library/dd287147.aspx我一直在生产中使用这些类,它们确实满足了需求测试本土设计模式。

【讨论】:

    【解决方案2】:

    我创建了一个名为 ReactiveTables 的 UI 工具包,它允许您创建可以连接、过滤、扩展计算列然后绑定到 WPF 控件的活动表。这些表公开了一个 IObservable 接口,并且专为提高性能而设计。

    您可以将表直接连接到您的生产者/消费者实现,然后将它们绑定到您的视图。表格将通知单个单元格的更改,并且有一个帮助类将其转换为 INotifyPropertyChanged 事件。

    在接收端,有一些类可以限制 UI 表的更新并将数据线程编组到 UI 线程。

    【讨论】:

    • 谢谢 Slugart - 我正在检查这个
    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    相关资源
    最近更新 更多