Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UI线程上的后台处理?(Winforms)_Winforms - Fatal编程技术网

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

UI线程上的后台处理?(Winforms),winforms,Winforms,在Windows窗体的UI线程上,是否有一种(或者,您有自己的)首选方法来执行切片的后台处理?像MFC中的OnIdle()吗 在本机Windows编程中,您可以滚动自己的消息循环来执行此操作,但Application.Run()不允许我们访问消息循环 Application.Idle事件无法重复触发它 我想您可以使用p/Invoke调用本机PostMessage()(因为没有托管版本),为自己发布一条私有的“WM_IDLE”消息,并重写WndProc()以捕获它。我不知道这将如何与Applica

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

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

Application.Idle事件无法重复触发它

我想您可以使用p/Invoke调用本机PostMessage()(因为没有托管版本),为自己发布一条私有的“WM_IDLE”消息,并重写WndProc()以捕获它。我不知道这将如何与Application.Run()配合使用


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

我见过的最好的选择是使用修改后的版本。通过在渲染循环中添加对
Thread.Sleep()
的调用,可以显著降低CPU使用率

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


也就是说,在现代系统中,几乎总是有额外的内核。我建议只在真正的后台线程上进行处理。

受Reed关于多线程的讨论启发,我想到了自己可能的答案。我可能有办法重新触发应用程序。空闲:

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

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


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

1。AFAIK我的许多用户没有这个定义的“现代系统”。2.UI正在快速使用后台进程生成的新数据,因此出现了所有常见的多线程问题。3.99%的工作是在后台进程中进行的,因此UI和后台的单独核心不会购买更多的总吞吐量。@Conrad:这就是为什么我给了你一个完全停留在UI线程上的选项。。。然而,即使是过去3-5年的“低端”系统通常也有2个核心。将所有处理放在后台线程上可以使UI保持活动状态,即使在单核心低端系统中也是如此,这可能比在空闲时间尝试执行计划处理更容易。话虽如此,上述方法效果很好…@康拉德:我刚刚意识到——我的链接错了!我在上面写的应该更有意义。。。它在一个循环中使用Application.Idle和AppStileId,允许您做您想做的事情。(很抱歉-我之前粘贴了错误的一个)。Re-bg thread更容易:我正在尝试仔细考虑同步2个线程的细节(UI显示到目前为止生成的数据,bg thread生成更多数据),这对我来说似乎更复杂。Re-Error链接:现在有意义了!(旧链接指向一个已知的糟糕的解决方案。)对PeekMessage()进行一点P/Invoke,看起来不错。标记为“接受答案”。