【问题标题】:Windows Forms Application update when minimized最小化时 Windows 窗体应用程序更新
【发布时间】:2010-12-21 01:21:30
【问题描述】:

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

Application.Idle += new EventHandler(Update);

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

【问题讨论】:

    标签: c# winforms minimized


    【解决方案1】:

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

    根据 cmets 进行编辑

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

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

    【讨论】:

    • 实际上我只是想让我的主要更新程序连续执行。如果我在程序主函数中创建一个 while(true){} 循环,我会遇到内存不足异常,因为似乎垃圾收集器没有被调用..
    • 定时器的分辨率约为 20 毫秒,如果可以接受,我会使用它并忘记空闲。但听起来你以这种方式消耗了大量的 CPU 时间。我不想在我的笔记本电脑上使用它。
    • 我希望该函数被尽可能频繁地调用,因为它会处理一些图像并且这将很快发生(尽可能快)
    • 如果我使用 System.threading.Timer 的时间小于函数实际执行所需的时间,会发生什么?
    【解决方案2】:

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

    因此,设置一个延迟时间,例如 50 毫秒,并像这样编写事件处理程序:

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

    _isProcessing 是表单上的私有布尔变量。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 问题是:同时最小化。不是最小化。
      • @Henk,OP 说“当我最小化应用程序窗口时”它不起作用,然后他说“......在窗口最小化时也被调用”,所以我是/不是清楚他对哪个感兴趣...鉴于在 UI 最小化时似乎很少或没有理由进行更新(什么会触发更新??)我认为他的意思是“何时”被最小化...
      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多