2016-07-24 3 views
2

У меня есть класс с методом RefreshAsync, который может занять много времени. Я использую Mvvm light framework. мне нужно вызвать его после того, как созданный объект, но не каждый раз, когда я получаю это экземпляр из ServiceLocatorWPF DispatcherTimer не работает

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

Поэтому я использую DispatcherTimer создать отложенную логику обновления. Но он не срабатывает, и я не знаю, почему.

Вот код

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

Какая из этих конструкторов работает? Создание 'DispatcherTimer' должно быть из потока с активным' Dispatcher' (или иначе передать действительный активный 'Dispatcher' в конструктор). –

+0

И что делать, если я создаю экземпляр DispatcherTimer в DispatcherHelper.CheckBeginInvokeOnUI (() => ...)? Это будет работать? – Anton

+0

Я написал все это в ответе ниже. –

ответ

2

Создание DispatcherTimer должно быть сделано из потока с активным Dispatcher или путем пропускания активного диспетчеру конструктору таймера, например,

new DispatcherTimer(Application.Current.Dispatcher) 

Вы должны также рассмотреть, если вам действительно нужно DispatcherTimer ... Вид модель могла бы большую часть времени делать с обычным таймером (например System.Timers.Timer). Или в вашем случае, еще лучше - простой Task.Delay в асинхронном методе:

private async Task DefferedUpdate() 
{ 
    await Task.Delay(TimeSpan.FromMilliseconds(20)).ConfigureAwait(false); 
    await RefreshAsync().ConfigureAwait(false); 
} 
Смежные вопросы