gpt4 book ai didi

wpf - 如何在 WPF UI 代码中等待后台线程/操作完成?

转载 作者:行者123 更新时间:2023-12-04 23:27:39 25 4
gpt4 key购买 nike

例如在Winforms我会写...

// on UI Thread
BackgroundWorker workerThread = new BackgroundWorker();
workerThread.DoWork += new DoWorkEventHandler(LoadChildren);
workerThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OnLoadChildrenCompleted);
while (workerThread.IsBusy)
{
Application.DoEvents();
}

在 WPF 中,Winforms 中的 Application.DoEvents 是什么?

我的 ViewModel 类中有一个名为 Children 的属性。 HierarchicalDataTemplate 已设置为从 Children 属性中读取 Items。
TreeView 显示节点。当用户展开一个节点时,节点的子节点是根据这个属性的结果生成的
public Node Children
{
get
{
// 1. time-consuming LINQ query to load children from a SQL DB
// 2. return results
}
}

所以我想在后台线程上运行 1. 并等待它完成,然后再返回结果......保持 UI 响应。

谷歌搜索将我带到 this page which has uses DispatcherFrames to simulate the above method .但这似乎工作量太大……这暗示了“我这样做对吗?”

最佳答案

据我了解,您有这种流程:

  • 做一些准备工作(UI 线程)
  • 做一些后台工作(其他线程)
  • 做一些收尾工作(UI线程)

  • 您想等待第二个项目符号完成,然后再运行第三个项目中的代码。

    最简单的方法是让第二个项目符号的代码回调到 UI 线程(以正常方式)以触发第三个项目符号执行。如果你真的,真的想使用方法中的局部变量,你总是可以使用匿名方法或 lambda 表达式来创建委托(delegate)以传递给后台工作人员 - 但通常只有一个“PostBackgroundWork”方法会更干净或类似的东西。

    编辑:这对于您在已编辑问题中显示的属性来说并不好,但我会将其重构为在完成时通过回调获取子项的请求。这避免了重入的整个困惑,并使实际发生的事情更清楚。

    关于wpf - 如何在 WPF UI 代码中等待后台线程/操作完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/438431/

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