2011-03-25 48 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}); 
    } 
相關問題