我正在使用 C# 开发一个基于窗口的应用程序,并运行一个计时器,该计时器在 Main MDI Parent 控件上运行,许多子控件从该控件打开/编辑/关闭。现在,我想知道整个应用程序是忙还是闲的计时器代码。如果任何控件正在执行任何任务,例如从数据库访问数据,或者执行插入查询或删除数据等,那么我应该知道应用程序正忙,如果不是,应用程序空闲。
提前致谢!
如果您使用的是 Windows 窗体 Timer ( System.Windows.Forms.Timer
),那么Tick
当 UI 线程忙时,计时器代码 ( event) 永远不会执行,除非有人Application.DoEvents()
在某事中间调用。但是,如果您有后台工作人员或其他类型的线程来执行某些任务,那么就没有明确的方法可以知道其他线程是否正忙于做某事。
您应该使用线程同步机制来确保您不会弄乱计时器事件中的某些内容。您还可以使用一些保护变量。最好考虑一些架构修复。
编辑: 您无法在计时器中检查应用程序空闲情况。如果一个操作在你的计时器注意到之前的几分之一秒内开始和完成怎么办?
最好的方法是拥有一个全局lastOperationTime
变量,并在DateTime.Now
每次采取行动时将其设置为。然后使用计时器检查从以下经过的时间lastOperationTime
:
void idleTimer_Tick (object sender, EventArgs e)
{
if ((DateTime.Now - lastOperationTime).TotalMinutes > 50)
{
...
}
}
最困难的部分是如何在每个执行一些有用操作的方法中注入一行代码!如果您有一个具有适当组织的基类的良好框架,则可能存在您应该将代码更新的特定(有限)点lastOperationTime
。
您应该将所有耗时的任务放在后台工作者 ( BackgroundWorker
) 类中。这样您就可以持续监控、获取进度并在需要时退出,而不会对 UI 产生任何影响。
这是示例应用程序的链接,
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx