2013-04-16 4 views
1

저는 C# (WPF)의 쓰레드에 새로운 것이므로 일부 레이블과 진행 막대 업데이트를 성공적으로 구현 했으므로 이해가 안됩니다. 왜 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 (항목);

미리 감사드립니다.

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

처음에 질문을 읽었습니다. updateTreeView 함수에 전달한 이러한 TreeView 항목 (List 항목)은 어디에 생성합니까? 메인 스레드에서도 생성했는지 확인하십시오. 당신의 TreeView 항목이 작업자 스레드에서 만들어지고 주 스레드에서 추가하려고하는 것처럼 보입니다. – Viv

답변

1

는 다음을 사용할 수 있습니다. 샘플에는 두 명의 디스패처가 있습니다. 당신은 그 스레드와 다른 스레드에서 생성 된 것으로 보이는리스트를 얻고 있다는 트리 뷰를 가지고 있습니다.

하지만 코드는 다음과 같이 보일 것입니다. 죄송합니다이 경우에는 VB에서 호출 내에서 대리자를 사용하고 있습니다.

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

원래 질문과 같이 노드를 추가하기 위해 UI 스레드에서 뛰어 내리지 않습니다.

+0

WPF를 사용하고 있기 때문에 몇 가지 변경 사항을 적용해야합니다. (나는 그들이 올바른 것임을 알았습니다.) 동일한 예외를 던졌습니다 ... 감사합니다. – user721807

+0

스레드를 어떻게 시작합니까? – Younes

+0

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

0

이 정말 오래된 질문이지만, 나는 그것을 대답 할 생각 :

관련 문제