调用线程访问错误

时间:2013-06-10 15:10:50

标签: c# wpf multithreading

我有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提前

1 个答案:

答案 0 :(得分:4)

Dispatcher.CurrentDispatcher返回当前线程的调度程序。如果您在后台线程上调用此方法,则会获得该后台线程的调度程序。为了编组回UI线程,您需要在UI线程上引用Dispatcher。您可以通过读取主线程上的Dispatcher.CurrentDispatcher属性的值来执行此操作,然后将该值传递给后台线程。