2011-01-13 9 views
0

こんにちは、私はこの状況を解決しようとします。 MVVMデザインのWPFアプリがあります。私はCaliburn Micro frameworkと注射MEFを使用します。多くの時間を消費/消費するビューモデル呼び出しの呼び出しメソッド

WPFアプリでは、外部アセンブリからサービスを使用しています。それは良い作品です。

問題があります。リストボックスに観測可能な辞書をバインドします。リストボックスは、0〜400のアイテムで構成できます。 私は画像とsom texboxで構成されたリストボックスの項目にデータテンプレートを持っています。リストボックスは、 のようなもので、SkypeやGoogle Talkの連絡先リストです。

私はサービスから3〜4秒ごとにメソッドを呼び出し、辞書として新しいデータを返します。このデータは、リストボックスをリフレッシュします。

このようなビューモデルでの私のコードを見て:

 private DispatcherTimer _dispatcherTimer; 
      private MyObservableDictionary<string, UserInfo> _friends; 
      //temp 
      private MyObservableDictionary<string, UserInfo> _freshFriends; 

    //bind on listbox 
      public MyObservableDictionary<string, UserInfo> Friends 
      { 
       get { return _friends; } 
       set 
       { 
        _friends = value; 
        NotifyOfPropertyChange(() => Friends); 
       } 
      } 

    //in constructor of view model I have this: 
       _dispatcherTimer = new DispatcherTimer(); 
       _dispatcherTimer.Tick += DispatcherTimer_Tick; 
       _dispatcherTimer.Interval = TimeSpan.FromSeconds(3); 
       _dispatcherTimer.Start(); 

// on timer tick I call method from service 
     private void DispatcherTimer_Tick(object sender, EventArgs eventArgs) 
     { 

      //get new data from server 
      //method GetFriends take much of time 
      _freshFriends = _service.GetFriends(Account); 

      //delete old data 
      _friends.Clear(); 

      //refresh 
      foreach (var freshFriend in _freshFriends) 
      { 
       Friends.Add(freshFriend); 

      } 
     } 

私が言ったように、問題は、サービスからメソッドGetFriendsは、時間と私のアプリがフリーズの多くを取ることです。

どのようにこの問題を解決できますか? winformsアプリで私はバックグラウンドワーカーを使用していますが、これはMVVMを備えた私の最初のWPFアプリです。ビューモデルクラスで多くの時間を消費する呼び出しメソッドは、どのような "patern"または "design"でも存在しますか?別のスレッドでこのメソッドを呼び出しますか?

+2

としています。BackgroundWorkerは、WinFormsと同様にWPFでも動作します。 –

+0

@Wonkoとまったく同じように、サービスリクエストを別のスレッド(ThreadPool内のものなど)で生成し、BackgroundWorkerなどを使用することができます。結果が返ってきたらメインUIスレッドに通知してListBoxに入力します。これはスレッドの問題であり、WPF/MVVMの問題ではありません。 –

答えて

関連する問題