2

我有一个 Windows 窗体应用程序,我在窗体的构造函数中添加主循环,如下所示:

Application.Idle += new EventHandler(Update);

效果很好 - 但是,当我最小化应用程序窗口时不会调用我的更新函数。我需要做什么才能在窗口最小化的同时调用我的更新函数?

4

3 回答 3

3

您可以从 System.Threading.Timer 调用它。要么在最小化时启动计时器,要么让它运行(低频)并在调用更新之前测试最小化。

根据评论编辑

最明智的做法是Update从另一个线程运行代码。Idle-event 或 Timer 解决方案都会遇到问题。

但是使用线程时,您必须小心触摸任何 UI 控件。一个简单的方法是BackgroundWorker。它具有线程安全执行的 Completed 和 Progress 事件。

于 2009-11-27T17:17:47.813 回答
1

您可以按照 Henk 的建议使用计时器,但只需添加一个标志,表明该方法仍在处理中。

所以,设置一个延迟时间,比如说,50ms,然后像这样编写事件处理程序:

private void timer1_Tick(object sender, EventArgs e)
{
    if ((this.WindowState == FormWindowState.Minimized) && !_isProcessing)
    {
        _isProcessing = true;

        // Do stuff

        _isProcessing = false;
    }
}

_isProcessing表单上的私有布尔变量在哪里。

如果您希望每个操作花费不到 50 毫秒,那么以某种方式聚合这些操作(也许一个队列是合适的)。

于 2009-11-27T22:02:36.670 回答
0

我必须尝试一下才能确定,但​​我的第一个猜测是连接表单 Resize 事件,并在处理程序中检查表单是否最小化......

于 2009-11-27T17:20:19.197 回答