当WPF表单处于最小化Stat时,Dispatcher线程和UI呈现线程工作

时间:2011-09-26 20:46:22

标签: wpf winforms dispatcher

我有两个关于WPF Dispatcher Thread的问题。

  1. 当您的WPF表单处于最小化状态时,调度程序线程是否继续运行。
  2. 我有很多动态更新,所以我将更新的直到winform,然后在winform中使用Timer来更新UI。在winform中最小化winform时,Timer将在UI线程中创建时停止工作。所以我的CPU利用率很低。如果我必须在WPF MVVM中实现相同的行为,那么我该如何实现呢?

1 个答案:

答案 0 :(得分:2)

你的问题似乎都假设最小化你的应用程序会以某种方式阻止你的一些线程。我不知道你在哪里有这个想法,但这是完全错误的。即使您已最小化,您的UI线程仍在运行。当你取消最小化它时,它还会如何处理“恢复”命令? Windows如何能够在任务栏上显示其标题?

你似乎也认为WPF有一个“调度程序线程”,它有些特殊。事实并非如此。 Dispatcher取代了Windows消息队列,这意味着它附加到UI线程。你称之为“调度程序线程”的东西与UI线程的相同的东西。如果你在同一个应用程序中运行WinForms和WPF,它们都运行在同一个UI线程上(除非你手动启动新线程并在它们上启动自己的调度程序,但这是一个非常不寻常的情况)。

不,你的Timer不会因为你的应用程序被最小化而停止运行(除非你手动编写代码来阻止它)。试一试:在您的计时器刻度事件中添加对Console.Beep()的调用,然后尝试最小化您的应用,并亲自查看是否一直发出噪音。

这是我的猜测:在你的计时器的Tick事件中,你的WinForms应用程序调用Invalidate()。当应用程序最小化时,Invalidate不执行任何操作 - 窗口未显示,因此没有任何内容可以使其无效 - 因此您看到CPU使用率较低,因为它没有执行任何操作。

如果您想在WPF中使用相同的行为,最好将此代码添加到Tick事件的开头:

if (WindowState == WindowState.Minimized)
    return;