1

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

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

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

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

非常感谢,

杰瑞

4

3 回答 3

3

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

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

于 2010-07-23T01:34:17.330 回答
1

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

现在,如果您对 DLL 的调用是同步调用并且它阻塞了 UI,那么,是的,您可能需要考虑使用 BackgroundWorker 来完成这项工作并允许您的主 UI 线程避免挂起。您可以参考如何在 C# 中实现进度条?一些答案。

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

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

  • 通过监听 DLL 中某个类发布的事件的订阅模型;或者
  • 一种轮询模型,用于定期(例如,在 Timer Tick 处理程序期间)主动监视在 DLL 中实现的某些数据对象。

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

于 2010-07-23T03:05:55.843 回答
0

ABackgroundWorker会起作用,Task对象也会起作用(我Task个人更喜欢)。我的博客有一个例子,它们都在做后台工作,完全支持取消和增量进度。您可能不需要这种复杂程度(例如,取消)。

于 2010-07-23T01:34:08.923 回答