这似乎是很常见的任务,但我没有任何运气来寻找答案。
我有一个 WPF/C# 应用程序,它严重依赖于数据库例程的 dll。我希望 dll 更新一些 GUI 元素,即进度条。
到目前为止,答案似乎在 System.ComponentModel 中的某个地方并创建了一个后台工作程序。但这是我能做到的。
有人可以就如何完成这项任务提供建议吗?链接,示例代码,鼓励的话赞赏!
非常感谢,
杰瑞
这似乎是很常见的任务,但我没有任何运气来寻找答案。
我有一个 WPF/C# 应用程序,它严重依赖于数据库例程的 dll。我希望 dll 更新一些 GUI 元素,即进度条。
到目前为止,答案似乎在 System.ComponentModel 中的某个地方并创建了一个后台工作程序。但这是我能做到的。
有人可以就如何完成这项任务提供建议吗?链接,示例代码,鼓励的话赞赏!
非常感谢,
杰瑞
最好的办法是设置它,以便 UI 在调用数据库 DLL 时传入回调函数。数据库 DLL “定期”调用该回调,然后在 UI 中实现的回调更新 UI 元素。
最好不要让您的数据库 DLL 与您的 UI 混在一起。一方面,它会使 DLL 非常依赖于你的 UI 的细节,以至于 DLL 不会真正被任何其他 exe 使用。
现在很难准确地说出您的代码是如何工作的,我认为答案取决于您当前的实现是否阻塞了 UI(即,通过对您的 DB DLL 进行同步调用)。
现在,如果您对 DLL 的调用是同步调用并且它阻塞了 UI,那么,是的,您可能需要考虑使用 BackgroundWorker 来完成这项工作并允许您的主 UI 线程避免挂起。您可以参考如何在 C# 中实现进度条?一些答案。
但是您仍然需要一些机制来了解您的 DB 调用的进度,而且听起来 DLL 还没有公开任何类似的东西。
只是在你问题的字里行间阅读,听起来你有一些修改 DLL 的能力。如果是这样,那么您应该尝试使用在提供进度信息时保留 DLL 和 UI 应用程序之间解耦的模式。您的 UI 代码应该真正负责根据 DLL 可以以松散耦合方式提供的一些数据来更新自身。我会建议使用:
无论哪种方式,您都希望通过对 DLL 进行编码以深入了解您的 UI 层,从而避免将两个层紧密耦合在一起。在大多数情况下,上述两种可能性都应该允许您将 UI 更新代码保留在应用程序的主 UI 线程上,这对于避免多线程问题很重要。
ABackgroundWorker
会起作用,Task
对象也会起作用(我Task
个人更喜欢)。我的博客有一个例子,它们都在做后台工作,完全支持取消和增量进度。您可能不需要这种复杂程度(例如,取消)。