2016-07-24 239 views
2

我有一個類RefreshAsync方法,可能需要很長時間才能執行。 我正在使用Mvvm輕型框架。 我需要調用它的對象創建後,但不是每次當我得到它從服務定位WPF 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

如果我在DispatcherHelper.CheckBeginInvokeOnUI(()=> ...)中創建DispatcherTimer實例會怎麼樣?它會起作用嗎? – 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); 
}