2

全て -

私は現在、エンドツーエンドで動作するPOC WPFプロジェクトを持っています。このアプリケーションは、ライブラリ (パブリッシャー) を通じて公開されるリアルタイムの市場データをシミュレートし、私の WPF クライアントはサブスクライバー (ハンドラー メソッドを持っています) です。カスタム イベントを使用してデータを公開します。

私が持っている質問はこれです:

1) Producer Consumer を実装したいので、ハンドラーはデータを Observable Collection に直接プルしません。

2) Producer/Consumer C# スニペット ( 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);
                    }
                }
            });
        }
    }
}
4

2 に答える 2

1

私はマーケット フィードを使っていくつかのプロジェクトを実行しましたが、あなたのチャートは概念的には問題ないように見えます。スケーラビリティの問題を回避するため、またはスケーラビリティの問題に対して積極的に設計するために、プロデューサー/コンシューマー ボックスに複数のインスタンスを持たせて、フィード内の複数のフィードおよび/または複数の手段に対応することを検討できます。たとえば、特定の市場が非常に不安定になった場合、他のすべての商品がデータ不足になることは望ましくありません。

また、特定の銘柄のフィードを任意の基準に基づいて切り替えることを好む人もいます。たとえば、ロンドンからゴールド フィックスまで YEN を取得し、次にニューヨークに切り替えてから再び東京に切り替えます。

私が言及できるもう1つのことは、プロデューサー/コンシューマーボックスから出る矢印がPOCO DTOのみを通過することです。アプリケーションの価値を高め、分離テストをより簡単にします。

ライブ フィード (またはシミュレートされたフィードでさえも) のテストは、アプリが展開可能になる前にテストする必要があるすべての条件を把握していないため、不十分です。

最後に、System.Collections.Concurrent 名前空間を使用して .NET 4.0 以降でプロデューサー/コンシューマー パターンが実装されたことに言及します... http://msdn.microsoft.com/en-us/library/dd287147.aspxこれらのクラスを本番環境で使用しており、独自の設計パターンをテストする必要性を大幅に削減しています。

于 2013-07-03T15:31:08.697 に答える
1

ReactiveTablesと呼ばれる UI ツールキットを作成しました。これにより、結合、フィルター処理、計算列による拡張、WPF コントロールへのバインドが可能なライブ テーブルを作成できます。テーブルは IObservable インターフェイスを公開し、パフォーマンスを考慮して設計されています。

テーブルをプロデューサー/コンシューマーの実装に直接接続してから、それらをビューにバインドできます。テーブルは個々のセルへの変更を通知し、これを INotifyPropertyChanged イベントに変換するためのヘルパー クラスがあります。

受信側には、UI テーブルへの更新を抑制し、データ スレッドから UI スレッドにマーシャリングできるクラスがあります。

于 2013-09-28T14:15:52.463 に答える