首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待线程问题

等待线程问题
EN

Stack Overflow用户
提问于 2009-11-18 21:55:14
回答 2查看 136关注 0票数 3

我有一个UserControl,上面有一棵树。它使用多线程向其添加节点。我有一个名为Expand的函数,我需要在过滤完成后执行它,因为我是一个多线程的新手,我不知道该怎么做。下面是我的代码:

代码语言:javascript
运行
复制
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()中,但它被卡住了。我该怎么办?

EN

回答 2

Stack Overflow用户

发布于 2009-11-18 22:01:48

如果它的单线程版本是:

代码语言:javascript
运行
复制
ClearTree();
AddFilteredResultsToTree(someparameter);
Expand();

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

我建议您只需从AddFilteredResult调用Expand,并在需要时使用Dispatcher来更新UI。

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

票数 2
EN

Stack Overflow用户

发布于 2009-11-18 22:02:29

调用Invoke将阻塞GUI线程和工作线程,因此与没有工作线程的代码相比,不会有任何性能改进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1756163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档