这似乎是非常常见的任务,但我没有运气寻找答案。
我有一个WPF / C#应用程序,它在很大程度上依赖于数据库例程的dll。我希望dll能够更新一些GUI元素,即进度条。
到目前为止,似乎答案存在于System.ComponentModel中并创建了一个后台工作者。但这就是我能得到的。
有人可以提供有关如何完成此任务的建议吗?链接,示例代码,鼓励的话语赞赏!
非常感谢,
杰里
答案 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进行编码来将两个层紧密耦合在一起,以便深入了解您的UI层。上述两种可能性都允许您在大多数情况下将UI更新代码保留在应用程序可执行文件的主UI线程中,这对于避免多线程问题非常重要。
答案 2 :(得分:0)
BackgroundWorker
可行,Task
对象(我更喜欢Task
)。我的博客有an example这两个做后台工作,完全支持取消和增量进度。您可能不需要这种复杂程度(例如,取消)。