2011-03-29 2 views
0

나는 나를 위해 treeview를 채우는 클래스를 작성했습니다. 내 프로젝트에서 나는이 트리 뷰가 여러 번 필요하고 나는 코드를 복사하여 붙여 넣기를 원한다. 그래서 나는 treeview를 채우는 클래스를 만들기로 결정했다.C# 컨트롤과 함께 작동하고 스레딩을 사용하는 클래스를 구현하는 방법은 무엇입니까?

일부 폼에서는 스레드를 사용하여 treeview를 채 웁니다. 이것은 때로는 데이터를로드하고 트리 뷰를 채우는 데 약간의 시간이 걸리기 때문입니다.

내 treeview 클래스에서 나는 생성자에서 treeview를 전달합니다. 내가 트리 뷰를 채우고 싶을 때 나는 LoadTreeview() 메서드를 호출합니다.

스레드에서 LoadTreeview 메서드를 호출하고 싶습니다.하지만 이렇게하면 다른 스레드에서 트리 뷰가 만들어지는 예외가 발생합니다. 물론 논리가 아닙니다. 하지만 궁금 해서요, 컨트롤과 함께 작동하는 사용자 정의 클래스를 만드는 가장 좋은 방법은 무엇이며 스레드에서이 클래스를 사용 하시겠습니까?

'GUI 작업'마다이 코드를 작성해야합니까?

treeview.Invoke((MethodInvoker)delegate 
{ 
    treeview.Nodes.Add(MyNode); 
}) 

다른 (더 똑똑한) 방법이 있습니까?

답변

2

귀하의 솔루션과 Levisaxos의 솔루션은 충돌을 예방할 수 있지만 실제로이 성능을 벤치마킹해야합니다. 문제는 많은 노드를 트리 뷰에 삽입하고 각 노드가 Control.Invoke를 통해 삽입되면 코드가 많이 수행되지는 않지만 UI 스레드와 동기화된다는 것입니다. 이 경우 실제로 노드를 삽입 할 때 트 리뷰의 노드를 작성하는 데 필요한 데이터로드를 별도로 고려해야합니다. 대신 데이터를 비동기 적으로로드 한 다음 모든 노드를 동시에 동 기적으로 삽입하십시오.

+0

당신은 invoke 컨트롤을 통해 노드를 추가해서는 안된다. TreeView를 호출하고 스레드에 노드를 추가합니다. 그런 다음 트리 뷰를 속성으로 설정하고 다른 클래스에서 필요에 따라 invoke를 통해 가져옵니다. –

+0

그럼 이해해 주시면 감사하겠습니다. 먼저 모든 데이터를 별도의 스레드에로드하고 해당 데이터가 있으면 트리 뷰 (UI 스레드에서)에 노드를 생성하십시오. – Martijn

+0

@Martijn : 그게 내가하는 방법이야. 물론 다른 솔루션도 유효합니다. 당신이 가장 편하게 느끼고 성능을 살펴보십시오. –

0
public delegate TreeView updateLabelDelegate(TreeView view); 
private TreeView InvokeTreeView(TreeView view) 
{ 
    if (view.InvokeRequired) 
    { 
     view.Invoke(new updateLabelDelegate(InvokeTreeView), new object[] { view }); 
     return null; 
    } 
    else 
    { 
     return view;     
    } 
} 

이 정보가 도움이되기를 바랍니다. 이것은 비동기 작업을 처리하는 방법입니다.

[편집] 사용 방법에 따라 다릅니다. 스레드에서 :

public TreeView thistreeviewsucks; 
void SomeThread() 
{ 
    TreeView tv = new TreeView(); 
    tv.Items.Add("something"); 
    //upon completion 
    this.thistreeviewsucks = InvokeTreeView(tv); 
} 

지금까지 내가이 일을 알고있다.

+0

Thnx. 그리고 위임자가 가리키는 방법은 같은 클래스에 있습니까? – Martijn

+0

죄송합니다. 편집을 잊어 버렸습니다. 대리자의 메서드는 해당 속성을 가리 킵니다. 편집 된 버전보기! –

+0

완벽하게 이해하지 못합니다. 코드에서 어떻게 사용합니까? 스레드에 노드를 추가하려면 어떻게해야합니까? – Martijn

관련 문제