BackgroundWorker mit Dispatcher scheint nicht, etwas zu tun
Ich versuche zu aktualisieren ObservableCollection
ist, dass Daten an die Benutzeroberfläche. Ich weiß, dass dies zu tun muss ich verwenden Dispatcher
und BeginvInvoke()
, und es so zu machen, dass die UI nicht einfrieren, wenn ich so tun, mit einem BackgroundWorker ist ein guter Weg, um darüber zu gehen. In jedem Fall, ich habe all dies, kompiliert und ausgeführt, aber nichts passiert. Ich brauche für die Aktualisierung der Benutzeroberfläche, alle 2 Minuten oder so, also ich bin auch mit einem DispatcherTimer
Dies funktioniert, weil DispatcherTimer ist Teil der Dispatcher, aber friert das UI:
DispatcherTimer dispTimer = new DispatcherTimer();
dispTimer.Tick += dispTimer_Tick;
dispTimer.Interval = new TimeSpan(0, 0, 45);
dispTimer.Start();
private void dispTimer_Tick(object sender, EventArgs e)
{
PartialEmployees.Clear();
}
So, mithilfe der BackgroundWorker-ich sammelte diese:
DispatcherTimer dispTimer = new DispatcherTimer();
dispTimer.Tick += dispTimer_Tick;
dispTimer.Interval = new TimeSpan(0, 0, 45);
dispTimer.Start();
private void dispTimer_Tick(object sender, EventArgs e)
{
BackgroundWorker _worker = new BackgroundWorker();
_worker.DoWork += DoWork;
_worker.RunWorkerAsync();
}
private void DoWork(object sender, DoWorkEventArgs e)
{
Dispatcher.CurrentDispatcher.BeginInvoke( new Action(()=>
{
PartialEmployees.Clear();
}));
}
Aber nichts geschieht, um das UI. Das, was ich bin fehlt/nicht tun, richtig?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie zwei Probleme:
Wenn Sie
Dispatcher.CurrentDispatcher
von der hintergrund-thread, es ist immer die hintergrund-thread-Dispatcher, nicht der UI thread Dispatcher.Aus Ihrer Beschreibung entnehme ich, dass Ihr
PartialEmployees.Clear()
Methode nimmt erhebliche Zeit ausführen, und Sie möchten vermeiden, sperren Sie den UI-thread während der Ausführung. Allerdings, mit einem BackgroundWorker aufrufenPartialEmployees.Clear()
auf Ihrem UI-Faden hat die gleiche Wirkung wie die Verwendung der DispatcherTimer, so müssen Sie eine andere Lösung als die, die Sie für gehen.Wenn Sie nur wollen, zu beheben, der Dispatcher.CurrentDispatcher problem, nur speichern der aktuellen Dispatcher in einer lokalen Variablen wie diese:
Dadurch wird die Benutzeroberfläche ändern, um zu arbeiten, aber es wird immer noch sperren Sie die Benutzeroberfläche, während die ändern, gerade so, als ob Sie noch nicht verwendet hatten, der BackgroundWorker-Klasse. Der Grund dafür ist:
Also Ihr Verhalten ist das gleiche, als wenn die DispatcherTimer-callback aufgerufen hatte PartialEmployees.Clear() direkt: In jedem Fall wird der zeitaufwändige Vorgang ausgeführt wird auf dem UI-thread.
Den Grund für die Systemabstürze ist, dass jedes mal, wenn Sie ein großes Stück Arbeit auf dem UI-thread erhalten Sie eine momentane blockieren, während es ausgeführt wird. Die Lösung ist, brechen Sie Ihre Arbeit in kleinere Portionen und tun Sie eine zu einem Zeitpunkt entweder von einem DispatcherTimer oder ein BackgroundWorker. In Ihrem Fall ist, überprüfen Sie den code für
PartialEmployees.Clear()
um zu sehen, ob es kann getan werden, inkrementell.Das problem hier ist, dass Sie mit der Methode
Dispatcher.CurrentDispatcher
aus dem Boden zurück thread. Was Sie brauchen, ist dieDispatcher
Instanz für den UI-thread.Ich glaube nicht, Sie müssen die Arbeit im hintergrund, als
BeginInvoke
auf dieDispatcher
läuft auf einem Threadpool-thread.so etwas sollte funktionieren, und ist kurz und bündig