【问题标题】:Updating WPF GUI from a DLL从 DLL 更新 WPF GUI
【发布时间】:2010-07-23 01:26:18
【问题描述】:

这似乎是很常见的任务,但我没有任何运气来寻找答案。

我有一个 WPF/C# 应用程序,它严重依赖于数据库例程的 dll。我希望 dll 更新一些 GUI 元素,即进度条。

到目前为止,答案似乎在 System.ComponentModel 中的某个地方并创建了一个后台工作程序。但这是我能做到的。

有人可以就如何完成这项任务提供建议吗?链接,示例代码,鼓励的话,赞赏!

非常感谢,

杰瑞

【问题讨论】:

  • 作为评论的快速驱动......看看 WPF 的调度程序。 Dispatcher 类为 WPF 中的消息泵提供了一个网关,并提供了一种机制来路由工作以供 UI 线程处理:msdn.microsoft.com/en-us/magazine/cc163328.aspx

标签: c# wpf user-interface system.componentmodel


【解决方案1】:

最好的办法是设置它,以便 UI 在调用数据库 DLL 时传入一个回调函数。数据库 DLL 会“定期”调用该回调,然后在 UI 中实现的回调会更新 UI 元素。

最好不要让您的数据库 DLL 与您的 UI 混在一起。一方面,它会使 DLL 非常依赖于你的 UI 的细节,以至于 DLL 不会被任何其他 exe 真正使用。

【讨论】:

  • 这是我最关心的问题,DLL 在以后的应用程序中的可重用性。我希望使我所做的一切都足够通用。但我喜欢你对回调函数的建议,我将对此进行探索。
【解决方案2】:

现在很难准确判断您的代码是如何工作的,我认为答案取决于您当前的实现是否阻塞了 UI(即,通过对您的 DB DLL 进行同步调用)。

现在,如果您对 DLL 的调用是同步调用并且它阻塞了 UI,那么是的,您可能需要考虑使用 BackgroundWorker 来完成这项工作并让您的主 UI 线程避免挂起。部分答案可以参考How do I implement a progress bar in C#?

但是您仍然需要一些机制来了解您的 DB 调用的进度,而且听起来 DLL 还没有公开类似的东西。

只是在您问题的字里行间阅读,听起来您具有修改 DLL 的能力。如果是这样,那么您应该尝试使用在提供进度信息时保留 DLL 和 UI 应用程序之间解耦的模式。您的 UI 代码应该真正负责根据 DLL 可以以松散耦合方式提供的一些数据来更新自身。我建议使用:

  • 通过监听的订阅模型 某个班级发布的事件 动态链接库;或
  • 主动轮询模型 定期监视在 DLL 中实现的某些数据对象 基础(例如,在 Timer Tick 期间 处理程序)。

无论哪种方式,您都希望通过编写 DLL 来避免将两个层紧密耦合在一起,以便深入了解您的 UI 层。在大多数情况下,上述两种可能性都应该允许您在应用程序的主 UI 线程上保持 UI 更新代码可执行,如果您想避免多线程问题,这一点很重要。

【讨论】:

  • 你说得对,我编写了 dll。你的建议也很有帮助。感谢您的回复!
【解决方案3】:

BackgroundWorker 可以工作,Task 对象也可以(我个人更喜欢Task)。我的博客有an example 这两个都在做后台工作,完全支持取消和增量进度。您可能不需要这种复杂程度(例如取消)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2018-10-17
    相关资源
    最近更新 更多