如何防止多个线程操作引用对象的实例

本文关键字:引用 对象 实例 操作 线程 何防止 | 更新日期: 2023-09-27 18:36:56

我目前正在使用 .NET Framework 设计和编写一个 C# 应用程序,该框架从文件中导入一些数据。导入数据后,可以将其绑定到一个或多个 Windows 窗体中的 DataGridView,以允许用户在将数据导出回文件之前对其进行操作。

我希望我的表单在导出过程中保持响应,并有可能取消导出操作。我打算创建一个 BackgroundWorker 并设置 DoWork 处理程序来执行导出操作,因此导出操作在后台线程中执行。我这样做是为了允许在表单中更新操作进度,以及其他原因。我打算将数据传递给工作线程以允许它执行导出。

但是,我担心一旦我启动工作线程并且我的工作线程正在执行导出操作(可能仍绑定到一个或多个 DataGridViews),我的数据可供多个线程访问,并且用户可以在导出时使用表单更新数据。

有谁知道我如何防止表单在导出时引用和弄乱数据?

还没有编写任何代码,但我在下面写了一些代码,我希望传达我的想法,我相信这是一种可怕的方法。

class Data : List<string>, MyInterface
{
}
class Form
{
   Data data;
  void SetData(Data data)
  {
      this.data = data;
      dataGridView.DataSource = data;
  }
  void ButtonClickHandler()
  {
     //Create a BackgroundWorker with the DoWork handler set up to
     //save/exports each item in data to a file.
  }
}

如何防止多个线程操作引用对象的实例

如果您不希望用户修改您尝试导出的数据,则有两个可行的选项:

  1. 禁用允许在导出过程中修改数据的 UI 部分(例如,将DataGridView单元格设为只读),或
  2. 在导出之前创建数据的副本,并导出副本,而不是用户能够编辑的实时数据。

其他同步技术会阻塞 UI 线程,这当然是一个巨大的"禁忌"。