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

时间:2015-01-10 05:06:40

标签: c# .net multithreading winforms datagridview

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

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

然而,我关注的是,一旦我启动了worker并且我的worker正在执行导出操作(可能仍然绑定到一个或多个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 个答案:

答案 0 :(得分:1)

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

  1. 禁用在导出过程中允许修改数据的UI部分(例如,将DataGridView单元格设为只读)或
  2. 导出前复制数据,然后导出副本,而不是用户可以编辑的实时数据。
  3. 其他同步技术会阻止UI线程,这当然是一个巨大的&#34; no-no&#34;。