2012-06-25 27 views
0

我正在C#中基于窗口的应用程序工作,并运行一个定时器,该定时器在主MDI父控件上运行,其中许多子控件从哪里打开/编辑/关闭。现在,我想知道在定时器代码中,无论整个应用程序是忙还是闲。如果任何控件正在执行任何任务,如从数据库访问数据,或者执行插入查询或删除数据等,则应该知道应用程序繁忙,如果不是应用程序闲置。如何知道控件正忙于在窗口应用程序中执行任何任务?

在此先感谢!

+0

你正在使用什么样的计时器? 'System.Windows.Forms.Timer','System.Threading.Timer'或'System.Timers.Timer'? –

回答

0

您应该将所有耗时的任务放在后台工作者(BackgroundWorker)类中。这样您就可以持续监控,取得进展并在需要时退出,而不会对用户界面产生任何影响。

这里是链接的示例应用程序,

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

+0

嗨@ MD.Unicorn,我正在使用System.Windows.Forms.Timer,在这里我喜欢知道这一点,因为我实现了一个自动注销功能,如果应用程序在50分钟的特定时间内处于空闲状态并闪烁警告消息,然后关闭所有打开的子控件。之后,它将使用户登录窗口。 – vicky

0

如果您使用的是Windows窗体Timer(System.Windows.Forms.Timer),那么计时器代码(Tick事件)当UI线程繁忙从来没有被执行,除非有人在某件事情中呼叫Application.DoEvents()。但是如果你有后台工作者或者其他类型的执行某些任务的线程,那么没有明确的方式来知道其他线程忙于做什么。

您应该使用Thread Synchronization机制来确保您不会在计时器事件中弄乱某些东西。你也可以使用一些警戒变量。最好考虑一些架构修复。

编辑: 你不能检查定时器中的应用程序空闲。如果在计时器通知之前,操作在几分之一秒内开始并完成,该怎么办?

最好的方法是创建一个全局变量lastOperationTime,并在每次执行操作时将其设置为DateTime.Now。然后用计时器来检查从lastOperationTime经过的时间:

void idleTimer_Tick (object sender, EventArgs e) 
{ 
    if ((DateTime.Now - lastOperationTime).TotalMinutes > 50) 
    { 
     ... 
    } 
} 

最难的是如何注入的代码行,在每个执行一些有用的操作方法!如果你有一个良好的框架和正确组织的基类,可能会有特定(有限)的点,你应该把代码更新为lastOperationTime

相关问题