2010-07-23 80 views
1

这看起来好像是很常见的任务,但我没有任何运气来寻找答案。从DLL更新WPF GUI

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

到目前为止,似乎答案在于System.ComponentModel中的某处并创建了一个BackgroundWorker。但是,就我所能得到的。

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

非常感谢,

杰里

+0

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

回答

3

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

这将是最好不要让你的数据库DLL与你的用户界面糟糕。首先,它会使DLL非常依赖于你的UI的细节,直到DLL不能真正被任何其他exe使用。

+0

这是我最大的关注,dll在以后的应用程序中的可重用性。我希望能够做出任何我足够通用的东西。但是我喜欢你对回调函数的建议,我将探讨这个函数。 – 2010-07-23 18:21:17

0

一个BackgroundWorker会的工作,作为一个将物体Task(我喜欢Task,个人)。我的博客有an example这两个这些做后台工作,完全支持取消和渐进式进展。您可能不需要这种复杂程度(例如,取消)。

1

现在有点难以确切知道你的代码是如何工作的,我认为答案取决于你当前的实现是否阻塞了UI(即通过对你的DB DLL进行同步调用)。

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

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

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

  • 通过监听 由 DLL一些类公布的一个事件订阅模式;或
  • 轮询模型主动 监视在DLL中以定期 为基础(例如,在定时器标记 处理程序期间)中实施的一些数据对象。

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

+0

你是对的,我创作了dll。你的建议也很有帮助。谢谢回复! – 2010-07-23 18:24:16