2009-11-18 152 views
3

我有一个用户控件与树上。它使用多线程向其添加节点。我有一个函数称为展开,我需要执行过滤完成后,因为我是一个多线程的新手我不知道如何做到这一点。这里是我的代码:等待的线程问题

class MyClass : UserControl 
{ 
    private Thread nThread; 
    private bool searchLoadCompleted = false; 

    private void Filter() 
    { 
     ClearTree(); 
     this.nThread = new Thread(new ParameterizedThreadStart(AddFilteredResultsToTree)); 
     this.nThread.IsBackground = true; 
     this.nThread.Start(someParameter); 
    } 

    private void AddFilteredResultsToTree(int someParameter) 
    { 
     myTree.Invoke(new MethodInvoker(()=> this.searchLoadCompleted = false)); 
     myTree.Invoke(new MethodInvoker(()=> AppendNode(......))); 
     myTree.Invoke(new MethodInvoker(()=> this.searchLoadCompleted = true)); 
    } 

    private void Expand() 
    { 
    } 
} 

我尝试添加nThread.Join()Expand()但它得到无限期地卡住。我该怎么办?

+0

为什么不把Expand()代码放到AddFilteredResultsToTree()中? – 2009-11-18 14:12:08

回答

2

如果这样做的单线程的版本是:

ClearTree(); 
AddFilteredResultsToTree(someparameter); 
Expand(); 

不要去打扰多线程,只是做在同一个线程。在那里使用多线程的关键是让主线程处理UI事件,如果你加入线程,那么你基本上只是在主线程中冻结(不做任何工作)的时候启动后台线程。请注意,通过调用Invoke,实际上将AddFilteredResultsToTree的执行委托给主线程。

我建议你简单地调用Expand从AddFilteredResult并使用分派器来更新UI,如果需要或。

另一种走(我认为最好)的方法是使用Async Pattern(示例和教程here),然后在AsyncCallback上更新UI。

1

调用Invoke将阻止GUI线程和工作线程,所以不会有没有工作线程的代码的性能改进。