2013-07-03 2 views
2

모두 -실시간 데이터 바인딩

저는 현재 종말을 맞이하는 POC WPF 프로젝트를 가지고 있습니다. 이 응용 프로그램은 라이브러리 (게시자)를 통해 게시되는 실시간 시장 데이터를 시뮬레이트하고 WPF 클라이언트는 구독자 (처리기 메서드 사용)입니다. 사용자 정의 이벤트를 사용하여 데이터를 게시합니다. 내가 가진

질문은 이것이다 :

1) 나는 생산자 소비자를 구현하려는 - 나의 핸들러가 직접 관찰 가능한 컬렉션에 데이터를 가져 오지 않습니다.

2) 제작자/소비자 C# 코드 단편 (http://msdn.microsoft.com/en-us/library/hh228601.aspx)을 구현하는 방법을 정확하게 알고 있지만 이것이 현재 아키텍처에서 어떻게 적용되는지 더 잘 이해하고 싶습니다. 여기에

3) 누군가가 코드 접근 방식으로 나를 도와 줄 수 다이어그램, 링크 등 시장 피드와 나는 몇 가지 프로젝트를 수행 한

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 읽기 - 불행히도 나는 닷넷 3를 사용하여 환경에 제한이 있습니다.5 따라서 전통적인 C# 방식을 사용하여이를 해결해야합니다. – Patrick

+0

그런 다음 DataFlow도 사용할 수 없습니다. Reactive Extensions를 3.5에서 사용할 수있는 반면 .NET 4 이상에서만 사용할 수 있습니다. –

답변

1

enter image description here

MainWindowViewModel.cs이며, 차트가 개념적으로 멋지게 보입니다. 확장 성 문제를 피하거나 확장 성 문제에 대해 사전 계획을 세우려면 생산자/소비자 상자에 피드 내의 여러 피드 및/또는 여러 악기를 수용 할 수있는 여러 인스턴스가 있어야한다고 생각할 수 있습니다. 예를 들어, 특정 시장이 매우 휘발성이된다면, 다른 모든 수단들이 굶어 죽는 것을 원하지 않을 것입니다.

또한, 어떤 사람들은 도쿄로 전환 다음 다시 금 수정 될 때까지 런던에서 엔을 받고, 다음 뉴욕으로 전환하고, 같은 임의의 기준에 따라 특정 장비에 대한 피드를 전환하려면. 내가 말할 수

다른 것은 POCO DTO의 만 전달하는 생산자/소비자 상자의 외출 화살표입니다. 응용 프로그램의 가치를 높이고 격리 테스트를 훨씬 쉽게 만듭니다. 그들은 응용 프로그램이 배포되기 전에 테스트하는 데 필요한 모든 조건을 캡처하지 않기 때문에

테스트 오프 라이브 피드 (또는 시뮬레이션 피드) 부족한 것입니다.

마지막으로 나는 System.Collections.Concurrent 네임 스페이스가있는 .NET 4.0에서 프로듀서/소비자 패턴이 구현되었다고 언급 할 것입니다. http://msdn.microsoft.com/en-us/library/dd287147.aspx 나는 프로덕션 환경에서 이러한 클래스를 사용하고 있으며 실제로 이러한 필요성을 줄였습니다. 가정에서 자란 디자인 패턴을 테스트하십시오.

1

저는 ReactiveTables이라는 UI 툴킷을 만들었습니다.이 툴킷을 사용하면 합류, 필터링, 계산 된 열로 확장 한 다음 WPF 컨트롤에 바인딩 할 수있는 라이브 테이블을 만들 수 있습니다. 테이블은 IObservable 인터페이스를 제공하며 성능을 위해 설계되었습니다.

당신은 당신의 생산자/소비자 구현에 직접 최대 테이블 후크 다음 뷰에 바인딩 할 수 있습니다. 테이블은 개별 셀에 대한 변경 사항을 알리고이를 INotifyPropertyChanged 이벤트로 변환하기위한 도우미 클래스가 있습니다. 수신 측에

는 UI 스레드에 형성 데이터 스레드를 UI 테이블과 원수에 대한 업데이트를 스로틀 수있는 클래스가 있습니다.

+0

Thanks Slugart - 감사합니다. – Patrick