0
我有一個Windows窗體應用程序,顯示網格視圖中的數據。數據正從後臺工作線程自動刷新(從數據庫中提取)。所以爲了避免任何交叉線程引用,在後臺線程的DoWork方法中,我調用GridView.BeginInvoke()並傳遞消息列表。但是在委託方法中,消息列表是空的。如果我使用GridView.invoke(),messageList確實包含這些值,但有時候會有一個異常說「對象當前正在其他地方使用」,我認爲這是由於引用了非控件上的UI控件引起的-UI線程。BeginInvoke不傳遞數據,但使用Invoke導致異常
我該如何解決這個問題?
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();
}