UI线程的后台处理? (的Winforms)

时间:2010-03-11 00:11:00

标签: winforms

是否有(或者,您有自己的)首选方法在Windows窗体中的UI线程上的切片中进行后台处理吗?像MFC中的OnIdle()一样?

在本机Windows编程中,您可以使用自己的消息循环来执行此操作,但Application.Run()不允许我们访问消息循环。

Application.Idle事件使我们无法重复触发它。

我猜你可以使用P / Invoke调用本机PostMessage()(因为没有托管版本)来发布一个私有的“WM_IDLE”消息,并覆盖WndProc()来捕获它。我不知道这会如何与Application.Run()相提并论。

到目前为止,我已经使用了一个短暂的定时器,但我担心我可能会失去周期休眠,特别是因为实际的定时器分辨率比标称的最小1 ms更粗糙。

2 个答案:

答案 0 :(得分:1)

我见过的最佳选择是使用Managed DirectX Render Loop designed by Tom Miller的修改版本。通过在渲染循环中添加对Thread.Sleep()的调用,可以显着降低CPU使用率。

这需要P / Invoke调用来跟踪应用程序仍处于空闲状态,但只要它处于空闲状态,您就可以创建一个在空闲阶段持续触发的“计时器”,并使用它来进行处理。

话虽如此,在现代系统上,你几乎总是有额外的核心。我建议只在真正的后台线程上进行处理。

答案 1 :(得分:0)

我想到了自己可能的答案,灵感来自里德关于多线程的讨论。我可能有办法重新触发Application.Idle:

创建一个隐藏的表单,我们称之为formRetrigger。

在Application.Idle中,在线程池线程上启动我的Retrigger()方法。

Retrigger()调用formRetrigger.InvokeOnClick()(或任何其他“Control.Invoke”方法)。我希望这会通过应用程序的队列启动另一条消息,导致Idle再次被触发。