2013-04-16 110 views
1

我很新的線程在c#(WPF),因爲我已經實現了一些標籤和progressbar更新成功,我不明白爲什麼當我嘗試添加項目到我的GUI的treeView從被稱爲一個單獨的線程另一個類我得到一個異常:更新從另一個線程treeview

類型的未處理的異常「System.InvalidOperationException」 發生在WindowsBase.dll

其他信息:調用線程不能訪問此對象 因爲不同的線程擁有它。

我的更新樹視圖代碼是這樣的:

private void updateTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear) { 
      tree.Dispatcher.Invoke(new Action(() => { 
       if (clear) { 
        tree.Items.Clear(); 
       } 
       ItemCollection treeitems = tree.Items; 
       foreach (TreeViewItem item in items) { 
        treeitems.Dispatcher.Invoke(new Action(() => { 
         treeitems.Add(item); 
        })); 
       } 
       tree.ItemsSource = treeitems; 
      })); 
     } 

,並在線路異常點:

treeitems.Add(項目);

在此先感謝。

+0

我最初誤解了你的問題。你在哪裏創建你傳遞給updateTreeView函數的這些TreeView項目(List 項目)?你有沒有確保在主線程中創建它們。好像你的TreeView項目是在工作線程上創建的,然後試圖從主線程添加它們。 – Viv

回答

1

您可以使用以下方法:

delegate void DUpdateTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear); 
private void UpdataTreeView(TreeView tree, List<TreeViewItem> items, Boolean clear) 
    { 
     if (tree.InvokeRequired) 
     { 
      DUpdateTreeView d = new DUpdateTreeView(UpdataTreeView); 
      // replace this by the main form object if the function doesn't in the main form class 
      this.Invoke(d, new object[] { tree, items, clear }); 
     } 
     else 
     { 
      if (clear) 
      { 
       tree.Items.Clear(); 
      } 
      else 
      { 
       // Here you can add the items to the treeView 
       /*** 
       ItemCollection treeitems = tree.Items; 
       foreach (TreeViewItem item in items) 
       { 
        treeitems.Dispatcher.Invoke(new Action(() => 
        { 
         treeitems.Add(item); 
        })); 
       } 
       tree.ItemsSource = treeitems; 
       ***/ 
      } 
     } 
    } 
+0

由於我使用WPF,我不得不做一些改變(我認爲它們是正確的),它會拋出相同的異常...謝謝 – user721807

+0

你如何開始你的線程? – Younes

+0

this.demoThread = new Thread(new ThreadStart(someFunction)); this.demoThread.Start(); – Younes

0

這是一個非常古老的問題,但我想我會回答。你的樣本中有兩個調度員。你有一個樹形視圖,你得到它的線程和一個似乎是在不同線程中創建的列表。

但代碼應該看起來更像這樣。對不起,在這種情況下,我在調用中使用委託。

tree.Dispatcher.BeginInvoke(Sub() 
      Dim node = new TreeViewItem() With {.Header = "Header"} 
      tree.items.add(node) 
          End Sub) 

我不是跳出UI線程來添加像原始問題中的節點。

相關問題