System.Threading.Timer执行自动更新

时间:2013-10-20 10:32:45

标签: c# wpf multithreading timer

当我尝试在我的WTF应用程序中实现自动更新机制时,我在Must create DependencySource on same Thread as the DependencyObject.方法中的某处遇到了运行时错误OnPropertyChanged()。我知道WPF应用程序是STA,我应该使用调度程序,但这仍然无济于事(

更详细......

我有一个服务类,它在构造函数中设置了一个定时器来执行更新

public VisualNovelService(IVisualNovelRepository repository, TimeSpan autoUpdateInterval)
{
    this._repository = repository;
    this._autoUpdateInterval = autoUpdateInterval;
    this._visualNovels = _repository.GetAll();
    this._autoUpdateTimer = new Timer(
        (state) => Update(),
        null,
        TimeSpan.FromSeconds(3), // just so that I can test it, 
        Timeout.InfiniteTimeSpan);

    this._dispatcher = Dispatcher.CurrentDispatcher;
}

对象本身是在OnStartup方法中创建的,因此我相信调度程序一切正常。

protected override void OnStartup(StartupEventArgs e)
{
    Application.Current.Properties["VisualNovelService"] = new VisualNovelService(new FuwaVNRepository());

    var viewModel = new MainWindowViewModel();

    MainWindow.DataContext = viewModel;
    MainWindow.Show();
}

这是一个更新方法,这是我的代码中的恐怖分子:(

public event EventHandler<VisualNovelServiceEventArgs> Updated;

public void Update()
{
    _visualNovels = _repository.GetAll();

    // restart the autoupdate timer
    _autoUpdateTimer.Change(_autoUpdateInterval, Timeout.InfiniteTimeSpan);

    // raise the event
    _dispatcher.Invoke(
        () => Updated(this, new VisualNovelServiceEventArgs(_visualNovels)));
}

我在一个方法中订阅了Updated事件,除了在ViewModel中更改了一些属性之外什么也没做。因此我确信线程不使用其他线程的对象,我无法弄清楚为什么我会收到此错误。我究竟做错了什么? :(

1 个答案:

答案 0 :(得分:0)

错误必须在此行 -

_visualNovels = _repository.GetAll();

您正在尝试从后台线程设置_visualNovels,我怀疑这是绑定到GUI中的某个DP。所以,你也应该把这个电话放在UI Dispatcher上。

但是,我强烈建议您使用DispatcherTimer代替Timer。它专门为WPF创建。