我正在尝试更新主线程上的属性,它绑定到ProgressBar。在viewmodel中,我有波纹管代码,但无效。
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task task = Task.Factory.StartNew(() =>
{
DoLongRunningWork();
}).ContinueWith(_=>
{
ApplicationStatus = "Task finished!";
}, TaskScheduler.FromCurrentSynchronizationContext());
DoLongRunningWork()
{
// Alot of stuff
Task.Factory.StartNew(() =>
{
ProgressBarValue += progressTick;
}).Start(uiScheduler);
}
答案 0 :(得分:4)
如果属性ProgressBarValue
绑定到WPF元素,那么唯一可以更新ProgressBar
的线程就是创建它的线程。
所以,我的假设是包含ProgressBarValue
的类也实现了INotifyPropertyChanged
。这意味着您有一些提升事件PropertyChanged
的逻辑。
我会创建一个引发事件的方法,并始终使用Dispatcher
。 (Dispatcher
允许您在创建WPF控件的线程上调用函数。)
private void raisePropertyChanged(string name)
{
Dispatcher.InvokeAsync(()=>
{
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
});
}
这将始终更新正确线程上的ProgressBar
。