从DLL更新WPF GUI

时间:2010-07-23 01:26:19

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

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

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

到目前为止,似乎答案存在于System.ComponentModel中并创建了一个后台工作者。但这就是我能得到的。

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

非常感谢,

杰里

3 个答案:

答案 0 :(得分:3)

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

最好不要让你的数据库DLL乱用你的UI。首先,它会使DLL非常依赖于UI的细节,以至于DLL不会被任何其他exe实际使用。

答案 1 :(得分:1)

现在有点难以准确地说出你的代码是如何工作的,我认为答案取决于你当前的实现是否阻止了UI(即通过对数据库DLL进行同步调用)。

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

但是你仍然需要一些机制来了解你的数据库调用的进度,并且它听起来不像DLL那样暴露了这样的东西。

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

  • 通过收听订阅模型 由某些班级发表的一个事件 DLL;或
  • 积极主动的投票模型 监视DLL中实现的一些数据对象 基础(例如,在计时器勾选期间) 处理程序)。

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

答案 2 :(得分:0)

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