Call-Methode in Call-View-Modell, das nehmen / verbrauchen viel Zeit
-
11-10-2019 - |
Frage
Hallo Ich versuche, diese Situation zu lösen. Ich habe WPF-Anwendung mit MVVM Design. Ich benutze Caliburn Micro Framework und auf Injektion MEF.
In WPF app I Verwendung Service von externer Montage. Es funktioniert gut.
Das Problem ist. Ich binde beobachtbaren Wörterbuch zu listbox. Listbox kann von 0 bis 400 Stück bestehen. Ich habe Datenvorlage auf Listbox-Elemente mit Bild und som texbox bestehen. Listbox ist wie Kontaktliste in skype oder Talk Google.
Ich rufe alle 3-4 sec Methode aus dem Dienst, Wich neue Daten als Wörterbuch zurückgibt. Ein mit diesen Daten aj Refresh-List-Feld.
Mein Code Blick in View-Modell wie folgt aus:
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);
}
}
, sagte Wie ich, Problem ist, dass Verfahren GetFriends aus dem Dienst nehmen viel Zeit und meine App gefriert.
Wie kann dieses Problem lösen? In WinForms-Anwendung Ich Hintergrund Arbeiter verwenden, aber dies ist meine erste WPF-Anwendung mit MVVM. Es existieren jede „Patern“ oder „Design“, wie Call-Methode, die im Hinblick auf Modellklasse viel Zeit in Anspruch nehmen? Rufen Sie diese Methode in einem anderen Thread?
Lösung
As others have suggested, you can use a BackgroundWorker
in a WPF app, or if you are using .NET 4, then use the Task Parallel Library. Stephen Cleary has a nice post on the TPL compared to BackgroundWorker
here - http://nitoprograms.blogspot.com/2010/06/reporting-progress-from-tasks.html