2011-03-25 60 views
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(); 
    } 

回答

2
partList.Clear(); 

您发表的作品,而不是你有一个问题的代码。我将假设BeginInvoke而不是Invoke。 partList.Clear()方法将清空之前的列表,委托目标可以使用该列表。您应该在BeginInvoke调用之后创建列表的新实例。 UI线程现在可以无故障地与旧列表一起工作。粗略地

while (!isCancelled) 
    { 
     partList = new List<ClientMessage>(); 
     partList.AddRange(Model.LoadSearchResult()); 
     if (partList.Count == 0) break; 
     View.GridViewtMain.BeginInvoke(new AddMessagesDelegate(AddMessagesToGrid), new object[] {partList}); 
    } 
相关问题