我有2个viewModels - 一个用于主程序,另一个用于我的用户控件。当我动态创建用户控件时,我启动后台线程:
private void BackgroundWorkerDoWork(object sender, DoWorkEventArgs eventArgs)
{
Dispatcher.CurrentDispatcher.Invoke(()=> CustomControl.ViewModel.InOperation = true);
while (!StopMeasuring)
{
//some action
}
}
InOperation是我的userControl viewModel中的属性:
public virtual bool InOperation
{
get { return _inOperation; }
set
{
if (_inOperation==value) return;
_inOperation = value;
Dispatcher.CurrentDispatcher.Invoke(new Action(() =>
{
InOperationEvent(ControlId);
}));
}
}
我将InOperationEvent发送到我的主viewModel:
public void OnUsercontrolInOperationChanged(int controlId)
{
Dispatcher.CurrentDispatcher.Invoke(() => {
foreach (var userControl in _allUserControls.Where(control => control.Name == _currentUcName))
{
switch (userControl.Name)
{
//switch cases
}
}
});}
并且在运行时,在我的主viewModel中的foreach循环上我得到异常 - 调用线程无法访问此对象,因为另一个线程拥有它
有人能指出我错在哪里吗?
Thnx提前
答案 0 :(得分:4)
Dispatcher.CurrentDispatcher
返回当前线程的调度程序。如果您在后台线程上调用此方法,则会获得该后台线程的调度程序。为了编组回UI线程,您需要在UI线程上引用Dispatcher。您可以通过读取主线程上的Dispatcher.CurrentDispatcher
属性的值来执行此操作,然后将该值传递给后台线程。