调用线程无法访问此对象,因为其他线程拥有它 - 后台工作线程错误

本文关键字:线程 拥有 工作 错误 其他 后台 访问 调用 对象 因为 | 更新日期: 2023-09-27 18:35:26

我在下面有代码示例。我想使用BackGroundWorkers,但我有一个错误。

让我解释一下代码;

  • 属性是视图上数据网格的源。
  • 我有一个将Excel数据保存到数据库的按钮,它与SaveExcel:ICommand类绑定。
  • 当我按下此按钮时,它会在视图模型中调用 SaveExcel 方法。
  • 保存 excel 后在保存 Excel 方法中,我想刷新网格数据,所以我使用数据表设置 GridData 属性。
  • 当我设置此属性时,调用了在SaveGrid:ICommand类中委托的PropertyChanged事件(此类与另一个按钮绑定)
  • 在这里,CanExecuteChanged 方法给了我错误,"调用线程无法访问此对象,因为其他线程拥有它"。

我该如何解决这个问题?

任何帮助表示赞赏。

            public class MainViewModel
            {
                public DataTable GridData{get;set;}
                public void SaveExcel()
                {
                    .
                    .
                    .
                    RefreshGridData();
                }
                public void RefreshGridData()
                {
                    .
                    .
                    .
                    GridData = <selectedGridData>;
                }
                private void bgw_DoWork(object sender, DoWorkEventArgs e)
                {
                    SaveExcel();
                }
            }

            public class SaveExcel : ICommand
            {
                private MainViewModel viewModel;
                public SaveExcel(MainViewModel viewModel)
                {
                    this.viewModel = viewModel;
                    viewModel.PropertyChanged += (s, e) =>
                    {
                        if (CanExecuteChanged != null &&
                            (e.PropertyName == "SelectedA" || e.PropertyName == "SelectedB"))
                        {
                            CanExecuteChanged(this, new EventArgs());
                        }
                    };
                }
                public bool CanExecute(object parameter)
                {
                    return (viewModel.SelectedA != null && viewModel.SelectedB != null);
                }
                public event EventHandler CanExecuteChanged;
                public void Execute(object parameter)
                {
                    viewModel.bgw.RunWorkerAsync();
                }
            }

            public class SaveGrid : ICommand
            {
                private MainViewModel viewModel;
                public SaveGrid(MainViewModel viewModel)
                { 
                    this.viewModel = viewModel;
                    viewModel.PropertyChanged += (s, e) =>
                    {
                        if (CanExecuteChanged != null && e.PropertyName == "GridData")
                        {
                            CanExecuteChanged(this, new EventArgs());
                        }
                    };
                }
                public bool CanExecute(object parameter)
                {
                    return (viewModel.GridData.Rows.Count > 0);
                }
                public event EventHandler CanExecuteChanged;
                .
                .
                .
                .
            }

调用线程无法访问此对象,因为其他线程拥有它 - 后台工作线程错误

您需要在

UI 线程上调用刷新,在 WPF 中,可以通过调用代码中适当位置的 Dispatcher.Invoke 来执行此操作。例如

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => RefreshGridData()));
相关文章: