我有一个绑定到 BindingList 的 DevExpress GridControl。
我试图从一个线程修改 BindingList 并且这引发了一个异常,我用谷歌搜索它并找到以下解释:
此问题与 XtraGrid 没有直接关系。不幸的是,您不能在后台线程中更改网格的数据源,因为这会导致很多同步问题。XtraGrid 可能会在您的后台线程更改它的同时对底层数据源执行一些操作。在这种情况下,网格稍后可能会收到更改通知,并会尝试从数据源更新行,这将导致上述问题。很多情况下可能会出现这个问题。例如,当用户编辑数据、对其进行分组或 XtraGrid 尝试重新计算摘要时。此问题的唯一解决方案是在后台线程中更改 Grid 的 DataSource 引用(注意:您需要使用 Invoke 方法来实现它)。换个说法,在后台线程中,您应该使用 DataSource 的本地副本,并在必要时将其克隆传递给 Grid 的 DataSource。在随附的示例中,您将找到一个演示此方法的示例项目。
我尝试了它所说的,结果是:
proxyWorker = new Thread(() =>
{
//Clone the datasource into the thread
BindingList<Proxy> newList = new BindingList<Proxy>(proxies);
//Set the proxy source to the cloned datasource in the thread
gcProxies.BeginInvoke(new MethodInvoker(delegate { gcProxies.DataSource = newList; }));
//Logic here
});
proxyWorker.Name = "proxyTester";
proxyWorker.Start();
它有效,但我不明白线程结束后数据源会发生什么?不是newList
被毁了吗?
我在想的是,最后我会重新克隆 newList 并将其设置回proxies
(原始数据源)