2017-10-17 2 views
0

배경 작업자의 DoWork 메서드에서 TreeView 컨트롤의 머리글 속성에 액세스하려고합니다.WPF 배경 작업자의 DoWork 메서드에 TreeView 전달

var worker = new BackgroundWorker(); 
worker.DoWork += DoWork; 
worker.RunWorkerAsync(MyTreeView); 

private void DoWork(object sender, DoWorkEventArgs e) 
{ 
    var x = (e.Argument as TreeView); 
    var item1 = x.Items[0] as TreeViewItem; 

    //error here.. 
    var headerItem1 = item1.Header; 
} 

I 액세스하려는 속성이 다른 스레드 (내 경우에는 UI 스레드)가 소유하고 있다고 throw되는 오류 :

나는 다음과 같은 노력했다.

이 문제는 지금까지 TreeView 컨트롤에서만 발생했습니다. 합격 한 다음 Labels 또는 TextBlocks과 같이 덜 복잡한 '컨트롤'에 액세스하면 정상적으로 작동합니다.

모든 답변 주셔서 감사합니다.

+0

TreeView에서 Label 또는 TextBlock 컨트롤을 사용했을 때보 다 더 많은 데이터를 처리하고있을 가능성이 있습니다. 가능한 복제본 [https://stackoverflow.com/q/9732709/6026377](https://stackoverflow.com/q/9732709/6026377) –

답변

0

규칙 : 은 GUI 스레드의 GUI 요소 (컨트롤)에만 액세스합니다.

BackgroundWorker에서 DoWork 이벤트 처리기는 백그라운드 스레드에서 호출됩니다. 해당 스레드의 GUI 요소에 액세스 할 수 없습니다. 액세스 란 속성 (또는 인덱서) 읽기 또는 쓰기 또는 메소드 호출을 의미합니다.

배경 스레드에서 컨트롤을 사용하여 작업해야하는 경우 Dispatcher.Invoke 메서드를 사용하십시오. 그러나 Invoke/BeginInvoke 방법을 사용하면 전체 성능에 영향을 미칠 수 있습니다 (예 : 긴밀한 루프에서 사용되는 경우).

배경 스레드의 GUI 요소에 액세스 할 필요가없는 방식으로 논리를 다시 디자인해야합니다. 이것은 최상의 해결책이 될 것입니다.

그런데

, 난 당신이 현대 비동기 패턴 (async/await & Task들)에 BackgroundWorker에서 이동하는 것이 좋습니다.