gpt4 book ai didi

c# - 调用线程无法访问此对象,因为另一个线程拥有它 - BackgroundWorker 错误

转载 作者:行者123 更新时间:2023-11-30 20:45:53 30 4
gpt4 key购买 nike

<分区>

我有下面的代码示例。我想使用 BackGroundWorker 但出现错误。

我来解释一下代码;

  • GridData 属性是 View 上 DataGrid 的来源。
  • 我有一个将 Excel 数据保存到数据库的按钮,它与 SaveExcel:ICommand 类绑定(bind)。
  • 当我按下此按钮时,它会调用 View 模型中的 SaveExcel 方法。
  • 在保存 excel 后的 SaveExcel 方法中,我想刷新网格数据,因此我将 GridData 属性设置为数据表。
  • 当我设置此属性时,将调用在 SaveGrid:ICommand 类中委托(delegate)的 PropertyChanged 事件。(此类与另一个按钮绑定(bind))
  • 在这里,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;

.
.
.
.

}

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com