c#winforms sdi应用程序更新多个进度条

c#winforms sdi应用程序更新多个进度条,c#,winforms,event-handling,progress-bar,toolstripitem,C#,Winforms,Event Handling,Progress Bar,Toolstripitem,祝大家新年快乐 我正在开发一个C#Winforms SDI应用程序,它严重依赖后台工作线程来执行长时间运行的数据库查询。我的主对话框包含进度标签和进度条;还有一个Toolstrip菜单,其中包含两个Toolstrip标签和两个Toolstrip进度条。我通过事件处理程序调用的委托更新进度标签和进度条(OnUpdateProgress(object sender UpdateProgressEventArgs e)) 我正在征求您的专家意见,以确定在调用UI委托时应使用何种方法来实现更“通用”和可

祝大家新年快乐

我正在开发一个C#Winforms SDI应用程序,它严重依赖后台工作线程来执行长时间运行的数据库查询。我的主对话框包含进度标签和进度条;还有一个Toolstrip菜单,其中包含两个Toolstrip标签和两个Toolstrip进度条。我通过事件处理程序调用的委托更新进度标签和进度条(OnUpdateProgress(object sender UpdateProgressEventArgs e))

我正在征求您的专家意见,以确定在调用UI委托时应使用何种方法来实现更“通用”和可重用的方法

Thusfar我考虑了2个:

(1) 从主对话框实例化工作线程以执行后台任务时,将句柄传递给事件处理程序回调时要更新的标签和进度条控件,以及 (2) 传入调用事件处理程序时要更新的标签和进度条的名称;并使用Form.Find方法检索匹配控件的控件[]

我无法决定使用哪种方法;或者,如果有更好的方法来做到这一点。我认为方法(1)有点笨重和不雅;但该方法(2)容易失败,尽管Form.Find方法可能会为嵌入式Toolstrip菜单控件引入不合理的开销搜索

我已搜索了以前提出/回答的问题以寻求解决方案


非常感谢您的建议

我认为工作线程不需要知道应该更新哪些控件。它只需要将进度通知发布到给定的控件(在您的例子中是对话框)。被调用的函数应该决定应该更新哪些控件以及如何更新。这一点一开始就很糟糕。当您可以测量进度时,可以使用进度条。不能,您不知道从数据库引擎获得结果需要多长时间。直到完成你才知道,太晚了。在创建UI时,不要强迫用户盯着进度条。进行不超过一秒钟的小查询。@Alex。这意味着获取后台工作程序的类型,可能在switch语句中:switch(sender.GetType())并处理不同的情况,如果可能的话,我希望在UI事件处理程序回调中避免这种情况。@Hans,当后台工作程序根据计数(*)计算其工作负载时,我实际上可以测量进度查询以确定感兴趣域中的记录数。使用仅向前的数据读取器读取记录。主循环使用“while(Reader.Read())构造进行控制。主循环(1)检查线程取消,(2)获取1条记录(进行匹配),(3)以计算完成的工作百分比调用OnUpdateProgress事件处理程序。我只是想知道是否有人有更优雅的解决方案。实际上,工作线程可能被封装在一个类中,该类公开了进度事件。线程必须只知道执行其设计的任务,并且如果对进度通知感兴趣,则通知客户端即使是Invoke/BeginInvoke也必须由客户端调用-线程可能在非UI环境或WPF应用程序中运行。这看起来有些过分,但您讨论的是程序设计。