0

我有 2 个视图模型 - 一个用于主程序,另一个用于我的用户控件。当我动态创建用户控件时,我启动后台线程:

 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
                }
            }
        });}

在运行时,在我的主视图模型中的 foreach 循环中,我得到异常 -调用线程无法访问该对象,因为不同的线程拥有它

谁能指出我错在哪里?

提前谢谢

4

1 回答 1

4

Dispatcher.CurrentDispatcher返回当前线程的调度程序。如果您在后台线程上调用它,您将获得该后台线程的调度程序。为了编组回 UI 线程,您需要对 UI 线程上的 Dispatcher 的引用。您可以通过读取Dispatcher.CurrentDispatcher主线程上的属性值来做到这一点,然后将该值传递给后台线程。

于 2013-06-10T15:17:25.370 回答