调用线程访问错误

本文关键字:错误 访问 线程 调用 | 更新日期: 2023-09-27 18:17:49

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

和在运行时,在foreach循环在我的主viewModel我得到异常- 调用线程不能访问这个对象,因为一个不同的线程拥有它

谁能指出我错在哪里吗?

调用线程访问错误

Dispatcher.CurrentDispatcher返回当前线程的调度程序。如果你在后台线程上调用这个,你会为那个后台线程获得一个dispatcher。为了封送回UI线程,您需要对UI线程上的Dispatcher进行引用。你可以在主线程上读取Dispatcher.CurrentDispatcher属性的值,然后将该值传递给后台线程。