グリッド ビューでデータを表示する Windows フォーム アプリケーションがあります。データは、バックグラウンド ワーカー スレッドから自動的に更新 (DB から取得) されています。したがって、クロススレッド参照を避けるために、バックグラウンド スレッドの DoWork メソッドで GridView.BeginInvoke() を呼び出し、メッセージのリストを渡します。ただし、デリゲート メソッドでは、メッセージ リストは空です。
GridView.invoke() を使用すると、messageList に値が含まれますが、「オブジェクトは現在別の場所で使用されています」という例外が発生することがあります。これは、非 UI スレッドで UI コントロールを参照することが原因であると考えられます。
どうすればこの問題を解決できますか?
public delegate void AddMessagesDelegate(List<ClientMessage> tempMessageList);
private void SearchWorkerDoWork(object sender, DoWorkEventArgs e)
{
List<ClientMessage> partList = new List<ClientMessage>();
View.GridViewtMain.Invoke(new InvokeDelegate(ClearMessagesFromGrid));
//View.GridViewtMain.BeginInvoke(new InvokeDelegate(ClearMessagesFromGrid));
partList.AddRange(Model.LoadSearchResult());
View.GridViewtMain.Invoke(new AddMessagesDelegate(AddMessagesToGrid), new object[] {partList});
//View.GridViewtMain.BeginInvoke(new AddMessagesDelegate(AddMessagesToGrid), new object[] {partList});
while (!isCancelled && (partList.Count > 0))
{
partList.Clear();
partList.AddRange(Model.LoadSearchResult());
View.GridViewtMain.Invoke(new AddMessagesDelegate(AddMessagesToGrid), new object[] {partList});
//View.GridViewtMain.BeginInvoke(new AddMessagesDelegate(AddMessagesToGrid), new object[] {partList});
}
}
private void ClearMessagesFromGrid()
{
messageDataSource.Clear();
}
private void AddMessagesToGrid(List<ClientMessage> tempMessageList)
{
View.GridViewMain.BeginDataUpdate();
foreach (ClientMessage message in tempMessageList)
{
messageDataSource.Add(message);
}
View.GridViewMain.GridControl.DataSource = messageDataSource;
View.GridViewMain.EndDataUpdate();
}