2016-07-24 17 views
2

Ich habe eine Klasse mit RefreshAsync-Methode, die lange dauern kann, um auszuführen. Ich benutze Mvvm Lightrahmen. Ich brauche es zu nennen nach Objekt erstellt, aber nicht jedes Mal, wenn ich es bekommen Instanz von ServicelocatorWPF DispatcherTimer feuert nicht

var vm = ServiceLocator.Current.GetInstance<FileSystemViewModel>(); 

So DispatcherTimer ich verwenden, um aufgeschobene Update-Logik zu erstellen. Aber es feuert nicht und ich weiß nicht warum. Hier

ist der Code

private DispatcherTimer _timer; 

public FileSystemViewModel() 
{ 
    _timer = new DispatcherTimer(DispatcherPriority.Send) {Interval = TimeSpan.FromMilliseconds(20)}; 
    _timer.Tick += DefferedUpdate; 
    _timer.Start(); 
} 

private async void DefferedUpdate(object sender, EventArgs e) 
{ 
    (sender as DispatcherTimer)?.Stop(); 
    await RefreshAsync().ConfigureAwait(false); 
} 
+1

In welchem ​​Thread läuft dieser Konstruktor? Das Erstellen eines 'DispatcherTimer' muss von einem Thread mit einem aktiven' Dispatcher' erfolgen (oder andernfalls einen gültigen aktiven 'Dispatcher' an den Konstruktor übergeben). –

+0

Und was, wenn ich DispatcherTimer-Instanz in DispatcherHelper.CheckBeginInvokeOnUI (() => ...) erstellen? Wird es funktionieren? – Anton

+0

Ich habe alles in der Antwort unten geschrieben. –

Antwort

2

ein DispatcherTimer Erstellen muss aus einem Gewinde mit einem aktiven Dispatcher oder durch Hindurchleiten eines aktiven Dispatcher an den Konstruktor des Timers durchgeführt werden, z.B.

new DispatcherTimer(Application.Current.Dispatcher) 

Sie sollten auch prüfen, ob Sie wirklich eine DispatcherTimer ... Ein Blick Modell mit einem regelmäßigen Timer tun die meiste Zeit benötigen könnten (z System.Timers.Timer). Oder in Ihrem Fall, noch besser - eine einfache Task.Delay in der asynchronen Methode:

private async Task DefferedUpdate() 
{ 
    await Task.Delay(TimeSpan.FromMilliseconds(20)).ConfigureAwait(false); 
    await RefreshAsync().ConfigureAwait(false); 
}