对于我正在处理的项目,我有一个带有一堆DataGridView组件的表单,用于显示一些数据。每个DataGridView都有自己的DataTable关联它。要显示的数据定期发送。我的应用程序必须读取此数据,解析它并相应地填充数据网格。因为我想保持表单的响应能力,所以我在无尽的后台工作者中实现了数据接收(阻塞)。
在后台工作程序中,我获取数据并将其解析/转换为适合DataTables的值。现在我的问题是:目前我将这些值直接分配给DataTable对象。 (所以我在背景工作者的DoWork活动中做到这一点)
我想知道这是否有效。我确实有一个索引超出范围异常一次,我想知道这是否与此有关。这是一种安全且推荐的方法,还是应该在我的backgroundworker的DoWork事件中使用调用来更新DataTables?
答案 0 :(得分:3)
不,.NET WinForm控件上的所有属性(这是假设)都会影响控件的呈现(包括绑定到控件的值,这会影响渲染)必须在创建控件的线程上进行。< / p>
也就是说,有很多次你能够做出改变,但行为是不可预测的,不推荐。
在您的具体情况下,我建议使用处理线程使用的DataTable
副本,然后将该副本封送到UI线程(通过调用{{3}之一)实现,ISynchronizeInvoke
interface实现)并更新UI线程中的网格。
基本上,您将使用从后台线程封送的副本执行网格绑定的DataTable
的更新。
答案 1 :(得分:0)
嗯,不。 虽然在后台线程中进行计算是一个非常好的主意,但UI更新应始终在UI线程中完成。
将Datatable绑定到UI元素时,您将这些对象的“所有权”“授予”UI线程,并且不应再在后台线程中更新它们
答案 2 :(得分:0)
公平地说,你永远不应该从非ui线程更新任何UI绑定元素。 虽然你经常会看到任何例外,但是从来没有好的做法,往往会导致异常,或者更糟糕的是,看不见的错误