当我尝试在我的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中更改了一些属性之外什么也没做。因此我确信线程不使用其他线程的对象,我无法弄清楚为什么我会收到此错误。我究竟做错了什么? :(
答案 0 :(得分:0)
错误必须在此行 -
_visualNovels = _repository.GetAll();
您正在尝试从后台线程设置_visualNovels
,我怀疑这是绑定到GUI中的某个DP。所以,你也应该把这个电话放在UI Dispatcher
上。
但是,我强烈建议您使用DispatcherTimer代替Timer。它专门为WPF创建。