2011-09-26 96 views
0

我有两个有关WPF调度程序线程的问题。调度程序线程和UI呈现WPF窗体处于最小化状态时的线程工作

  1. 是否调度线程保持当你的WPF的形​​式是在最小统计运行。
  2. 我有这么多的动态更新,所以我流动我的更新,直到winform,然后用户定时器在winform更新用户界面。在winform最小化winform时,你的Timer将停止工作,因为它是在UI线程中创建的。所以我的CPU利用率很低。如果我必须在WPF MVVM中实现相同的行为,那我该如何实现呢?

回答

2

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

你似乎也认为WPF有一个“调度程序线程”,它有点特别。事实并非如此。分派器代替了Windows消息队列,这意味着它已连接到UI线程。你称之为“调度员线程”的东西是相同的东西作为UI线程。如果你在同一个应用程序中执行WinForms和WPF,它们都运行在相同的UI线程上(除非你手动启动新线程并启动你自己的调度程序,但这是非常不寻常的情况)。

不,你的计时器不会因为你的应用程序被最小化而停止运行(除非你手动编写代码来停止它)。尝试一下:在你的计时器滴答事件中添加一个致电Console.Beep(),然后尝试最小化你的应用程序,并亲自看看它是否继续制造噪音。

这是我的猜测:在你的计时器的Tick事件中,你的WinForms应用程序调用Invalidate()。当应用程序被最小化时,Invalidate什么都不做 - 窗口没有显示,所以没有什么可以失效的 - 所以你看到CPU使用率很低,因为它没有做任何事情。

如果你想在WPF相同的行为,最好的办法是将此代码添加到您的Tick事件的开头:

if (WindowState == WindowState.Minimized) 
    return;