こんにちは、私はこの状況を解決しようとします。 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"でも存在しますか?別のスレッドでこのメソッドを呼び出しますか?
としています。BackgroundWorkerは、WinFormsと同様にWPFでも動作します。 –
@Wonkoとまったく同じように、サービスリクエストを別のスレッド(ThreadPool内のものなど)で生成し、BackgroundWorkerなどを使用することができます。結果が返ってきたらメインUIスレッドに通知してListBoxに入力します。これはスレッドの問題であり、WPF/MVVMの問題ではありません。 –