BindingList にバインドされた DevExpress GridControl があります。
スレッドから BindingList を変更しようとしたところ、例外がスローされました。Google で調べたところ、次の説明が見つかりました。
この問題は XtraGrid とは直接関係ありません。残念ながら、同期で多くの問題が発生するため、バックグラウンド スレッドでグリッドのデータ ソースを変更することはできません。XtraGrid は、バックグラウンド スレッドがデータ ソースを変更すると同時に、基になるデータ ソースに対していくつかの操作を実行する場合があります。この場合、グリッドは後で変更通知を受け取り、データ ソースから行を更新しようとするため、上記の問題が発生します。この問題は、多くの場合に発生する可能性があります。たとえば、ユーザーがデータを編集したり、データをグループ化したり、XtraGrid が集計を再計算しようとしたりする場合です。この問題の唯一の解決策は、バックグラウンド スレッド内でグリッドの DataSource 参照を変更することです (注: Invoke メソッドを使用して実装する必要があります)。別の言い方をすれば、バックグラウンド スレッド内で、DataSource のローカル コピーを操作し、必要に応じてそのクローンをグリッドの 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
(元のデータソース)に戻すことです