【发布时间】:2010-12-21 01:21:30
【问题描述】:
我有一个 windows 窗体应用程序,我在窗体的构造函数中添加主循环,如下所示:
Application.Idle += new EventHandler(Update);
效果很好 - 但是,当我最小化应用程序窗口时,不会调用我的更新函数。我需要做什么才能在窗口最小化时调用我的更新函数?
【问题讨论】:
我有一个 windows 窗体应用程序,我在窗体的构造函数中添加主循环,如下所示:
Application.Idle += new EventHandler(Update);
效果很好 - 但是,当我最小化应用程序窗口时,不会调用我的更新函数。我需要做什么才能在窗口最小化时调用我的更新函数?
【问题讨论】:
您可以从 System.Threading.Timer 调用它。要么在最小化时启动计时器,要么让它运行(低频)并在调用更新之前测试最小化。
最明智的做法是从另一个线程运行Update 代码。 Idle-event 或 Timer 解决方案都会遇到问题。
但是使用线程时,您必须小心触摸任何 UI 控件。一个简单的方法是BackgroundWorker。它具有线程安全执行的 Completed 和 Progress 事件。
【讨论】:
您可以按照 Henk 的建议使用计时器,但只需添加一个标志,表明该方法仍在处理中。
因此,设置一个延迟时间,例如 50 毫秒,并像这样编写事件处理程序:
private void timer1_Tick(object sender, EventArgs e)
{
if ((this.WindowState == FormWindowState.Minimized) && !_isProcessing)
{
_isProcessing = true;
// Do stuff
_isProcessing = false;
}
}
_isProcessing 是表单上的私有布尔变量。
如果您希望每个操作花费少于 50 毫秒,那么以某种方式聚合这些操作(也许一个队列是合适的)。
【讨论】:
我必须尝试一下才能确定,但我的第一个猜测是连接表单 Resize 事件,并在处理程序中检查表单是否最小化...
【讨论】: