gpt4 book ai didi

c# - 等待线程问题

转载 作者:行者123 更新时间:2023-11-30 16:35:30 26 4
gpt4 key购买 nike

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

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() 中,但它无限期地卡住了。我该怎么办?

最佳答案

如果这个的单线程版本是:

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

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

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

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

关于c# - 等待线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1756163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com