全て -
私は現在、エンドツーエンドで動作する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);
}
}
});
}
}
}