У меня есть приложение Windows Forms, которое показывает данные в виде сетки. Данные автоматически обновляются (выбираются из БД) из фонового рабочего потока. Таким образом, чтобы избежать каких-либо перекрестных ссылок, в методе DoWork фонового потока я вызываю GridView.BeginInvoke () и передаю список сообщений. Но в методах делегатов список сообщений пуст.
Если я использую GridView.invoke (), messageList действительно содержит значения, но иногда возникает исключение, которое говорит, что «объект используется в другом месте», которое, я считаю, вызвано из-за ссылки на элемент управления 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();
}