如何防止多个线程操作引用对象的实例?
How to prevent multiple threads manipulating instance of referenced object?
我目前正在使用 .NET Framework 在 C# 中设计和编写一个应用程序,该应用程序从文件中导入一些数据。导入数据后,它可以绑定到一个或多个 Windows 表单中的 DataGridView,以允许用户在数据导出回文件之前对其进行操作。
我希望我的表单在导出过程中保持响应,并有可能取消导出操作。我打算创建一个 BackgroundWorker 并设置 DoWork 处理程序来执行导出操作,因此导出操作是在后台线程中执行的。我这样做是为了允许在表格中更新操作进度,以及其他原因。我打算将数据传递给工作人员以允许它进行导出。
但是我担心,一旦我启动 worker 并且我的 worker 正在执行导出操作(它可能仍然绑定到一个或多个 DataGridView),我的数据就可以被多个线程访问,并且用户可以在导出数据时使用表单更新数据。
有谁知道如何防止表单在导出数据时引用和弄乱数据?
目前我还没有编写任何代码,但我已经在下面编写了一些代码,希望能传达我的想法,我确信这是一种糟糕的实现方式。
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.
}
}
如果您不希望用户修改您尝试导出的数据,您有两个可行的选择:
- 禁用允许在导出过程中修改数据的 UI 部分(例如,将
DataGridView
单元格设置为只读),或
- 导出前复制数据,并导出副本,而不是用户可以编辑的实时数据。
其他同步技术会阻塞UI线程,这当然是一个巨大的"no-no"。
我目前正在使用 .NET Framework 在 C# 中设计和编写一个应用程序,该应用程序从文件中导入一些数据。导入数据后,它可以绑定到一个或多个 Windows 表单中的 DataGridView,以允许用户在数据导出回文件之前对其进行操作。
我希望我的表单在导出过程中保持响应,并有可能取消导出操作。我打算创建一个 BackgroundWorker 并设置 DoWork 处理程序来执行导出操作,因此导出操作是在后台线程中执行的。我这样做是为了允许在表格中更新操作进度,以及其他原因。我打算将数据传递给工作人员以允许它进行导出。
但是我担心,一旦我启动 worker 并且我的 worker 正在执行导出操作(它可能仍然绑定到一个或多个 DataGridView),我的数据就可以被多个线程访问,并且用户可以在导出数据时使用表单更新数据。
有谁知道如何防止表单在导出数据时引用和弄乱数据?
目前我还没有编写任何代码,但我已经在下面编写了一些代码,希望能传达我的想法,我确信这是一种糟糕的实现方式。
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.
}
}
如果您不希望用户修改您尝试导出的数据,您有两个可行的选择:
- 禁用允许在导出过程中修改数据的 UI 部分(例如,将
DataGridView
单元格设置为只读),或 - 导出前复制数据,并导出副本,而不是用户可以编辑的实时数据。
其他同步技术会阻塞UI线程,这当然是一个巨大的"no-no"。