WPF DispatcherTimer不会触发

时间:2016-07-24 17:19:57

标签: c# wpf mvvm-light dispatchertimer

我有一个使用RefreshAsync方法的类,这可能需要很长时间才能执行。 我正在使用Mvvm轻型框架。 我需要在创建对象后调用它,但不是每次从servicelocator

获取它的实例时都调用它
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 个答案:

答案 0 :(得分:3)

创建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);
}