2

对于我正在处理的项目,我有一个带有一堆 DataGridView 组件的表单,这些组件用于显示一些数据。每个 DataGridView 都有它自己的与之关联的 DataTable。要显示的数据会定期发送。我的应用程序必须读取这些数据,对其进行解析并相应地填充数据网格。因为我想保持表单的响应能力,所以我在无休止的后台工作人员中实现了数据的接收(阻塞)。

在后台工作人员中,我获取数据并将其解析/转换为适合 DataTables 的值。现在这是我的问题:目前我将这些值直接分配给 DataTable 对象。(所以我在后台工作人员的 DoWork 事件中执行此操作)

我想知道这是否有效。我确实有一次索引越界异常,我想知道这是否与此有关。这是一种安全且推荐的方法吗,还是应该在后台工作人员的 DoWork 事件中使用调用来更新 DataTables?

4

3 回答 3

3

不,.NET WinForm 控件(这是假设)上影响控件呈现的所有属性(包括绑定到会影响呈现的控件的值)必须在创建控件的线程上进行。

也就是说,有很多时候您可以进行更改而侥幸逃脱,但这种行为是不可预测的,不推荐使用。

在您的特定情况下,我建议拥有DataTable处理线程使用的副本,然后将该副本编组到 UI 线程(通过调用类实现的ISynchronizeInvoke接口实现之一)并更新网格在 UI 线程中。Control

基本上,您将DataTable使用从后台线程封送的副本来执行网格绑定的更新。

于 2012-07-11T14:35:25.060 回答
0

嗯,不。虽然在后台线程中进行计算是一个非常好的主意,但 UI 更新应该始终在 UI 线程中完成。

将 Datatable 绑定到 UI 元素时,您将这些对象的所有权“授予”给 UI 线程,并且不应再在后台线程中更新它们

于 2012-07-11T14:31:19.570 回答
0

公平地说,您永远不应该从非 UI 线程更新任何 UI 绑定元素。尽管这样做通常可能看不到任何异常,但这绝不是一种好的做法,并且经常导致异常或更糟糕的是,看不见的错误

于 2012-07-11T14:35:12.273 回答