2013-04-16 66 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线程来添加像原始问题中的节点。

相关问题