gpt4 book ai didi

wpf - WPF 应用程序的多线程策略所需的建议

转载 作者:行者123 更新时间:2023-12-03 13:01:36 25 4
gpt4 key购买 nike

我正在构建一个单窗口 WPF 应用程序
窗口中是一个列表项(当然是保存在数据库中)
我需要定期启动一个后台任务,从 Atom 提要更新数据库。随着每个新项目被添加到数据库中,UI 中的列表也必须更新以反射(reflect)这一点。我不希望这个后台任务减慢 UI,但同时它需要与 UI 交互。

阅读了大量文章并看到了许多简单的示例,我仍然不确定实现这一点的最佳方法。

我想也许我可以做的是:

在 Window_Loaded 事件上,创建一个 DispatchTimer。
当 Tick 事件触发时,调用 UpdateDb() 方法。
UpdateDB() 将从 Atom 提要中获取项目并添加到数据库中。当我遍历每个项目时,我将调用另一个方法将列表重新绑定(bind)到数据库,以便它“刷新”。
当所有任务完成后,重置 DispatchTimer ??? (不确定这是否可以/需要/完成)。

请记住,这是后台任务,因此用户可以同时使用 UI。

这听起来如何?

谢谢。

最佳答案

这听起来不太理想,因为您正在 UI 线程上进行数据库连接。当Tick事件在 DispatcherTimer 上触发,处理程序将在 UI 线程上执行。您需要尽量减少在此线程上所做的工作量以保持 UI 响应,并且您绝对不应该在此线程上执行 IO 绑定(bind)工作。

我可能会有一个数据服务,其职责是更新数据库并在进行更改时引发事件。您的 UI 层可以附加到这些事件并编码到 UI 线程以应用更改。要编码到 UI 线程,您只需调用 Dispatcher.Invoke .

无论您采用何种具体方法,关键是在单独的线程上尽可能多地执行(包括任何数据库访问)。尽可能晚地编码(marshal)回 UI 线程,并在 UI 线程上做尽可能少的工作。

需要注意的另一件事是 WPF 会自动为您编码(marshal)对标量值的更改。您只需要编码对集合的更改(添加/删除/替换项目)。

关于wpf - WPF 应用程序的多线程策略所需的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341829/

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