C#跨线对话合作

C#跨线对话合作,c#,winforms,c#-3.0,C#,Winforms,C# 3.0,K我正在研究3.0中的一个主要的单线程windows窗体应用程序。最近,我的老板在一个单独的线程上添加了一个进度对话,这样当主线程离开并执行一些繁重的工作并锁定GUI时,用户将看到一些活动 除非用户切换应用程序或最小化进度表单,否则上述操作可以正常工作,因为进度表单位于最上面,并且不会随主应用程序一起消失。如果主窗体的事件结构在时间最小化时赶上了它的事件,并且可以检查活动标志,因此对话框线程可以相应地隐藏或显示自己,那么如果有很多小操作,这也不是很糟糕 但如果长时间运行的sql操作启动,则不会触

K我正在研究3.0中的一个主要的单线程windows窗体应用程序。最近,我的老板在一个单独的线程上添加了一个进度对话,这样当主线程离开并执行一些繁重的工作并锁定GUI时,用户将看到一些活动

除非用户切换应用程序或最小化进度表单,否则上述操作可以正常工作,因为进度表单位于最上面,并且不会随主应用程序一起消失。如果主窗体的事件结构在时间最小化时赶上了它的事件,并且可以检查活动标志,因此对话框线程可以相应地隐藏或显示自己,那么如果有很多小操作,这也不是很糟糕

但如果长时间运行的sql操作启动,则不会触发任何事件。我已尝试拦截WndProc命令,但在执行长时间运行的sql操作时,该命令也会出现排队。我也尝试过提取进程,查找当前的应用程序,并检查进程线程中的各种内存值isiconic等,但直到sql操作完成,这些都不会得到更新。当另一个应用程序激活时,删除最上面的应用程序会导致对话框消失,但如果主应用程序被恢复,则不会再次出现对话框

因此,我需要一种方法来确定另一个线程是否最小化或不再活动,这不涉及查询实际线程,因为它会锁定到sql操作完成

现在我知道,这不是写这篇文章的最佳方式,最好是让所有繁重的处理在单独的线程上,让GUI自由运行,但由于这是一个巨大的古老遗留应用程序,因此不会提供以这种方式重新编写的时间,因此我必须使用我所拥有的


感谢您的帮助

听起来好像长时间运行的操作已绑定到进度对话框?这通常是个坏主意,我想知道是否能显示出进展。
但是,您应该考虑使用A来运行长时间的操作。因此,您的GUI(主窗体和进度对话框保持活动状态)。
这样,您应该能够将主窗体的最小化事件发送到进度对话框,该对话框可以立即对其作出反应


顺便说一句,
BackgroundWorker
本身就支持进度报告。

长时间运行的op在主线程上启动(正式的唯一线程是什么)当这种情况发生时,GUI锁定在早期版本中,进度对话框被引入,以提供一些信息,向用户显示正在发生的事情,并且应用程序并没有崩溃。屁股在脸上乱翻,但这一切就是这样发生的。