0

我有一个包含多个计时器的表单应用程序,所有这些都在不同的时间执行任务,但是我现在开始在“不太好”的计算机上遇到我的应用程序问题。我的问题是 GUI 似乎没有得到它需要的时间。只需一个简单的按钮点击和非常小的任务就可能需要很长时间。而且我觉得它的“推动”本身被延迟了。所以现在我的问题是,有没有办法让 GUI 优先于计时器?例如,如果 GUI 需要工作,请跳过一个勾号?(没有计时器很重要,它不能跳过某个时间)。还是有其他方法可以让 GUI 正常工作?顺便说一句,我正在使用System.Timers.Timer,这是对前 System.Windows.Forms.Timer 的正确选择。

4

4 回答 4

1

System.Windows.Forms.Timer如果您使用的是 WinForms,您应该使用 .

此计时器针对在 Windows 窗体应用程序中的使用进行了优化,并且必须在窗口中使用。

如果您的应用程序中有 1 个或 100 个计时器,这并不重要。重要的是您在计时器回调(Tick处理程序)中所做的事情。任何花费超过“一点点”时间的代码都会给你的 UI 带来一种“呆滞”的感觉。

如果您可以详细说明所有计时器在做什么,并发布一些代码,我可以提供进一步的建议。

于 2013-03-07T06:21:28.467 回答
1

使用线程

创建新的(单独的)线程,不会干扰计时器,您的任务将同时完成。

但是,如果您正在处理复杂的数据,请等待所有线程完成,然后再继续!

我希望这个能帮上忙 :)

于 2013-03-07T06:25:10.120 回答
1

我相信,那些“不太好”的计算机没有足够的资源在短时间内处理您的任务。因此,您需要多线程。

它并不像听起来那么难,只需阅读一些教程,瞧。

于 2013-03-07T06:25:56.173 回答
0

如果您想在计时器事件中开始一些冗长的任务,最好在单独的线程中完成。最短/最简单的方法是这样的:

ThreadPool.QueueUserWorkItem((o) => { 
    // Do lenghty stuff
    // ...
    BeginInvoke((MethodInvoker)delegate() {
       // Update UI, if necessary
    });
});

我不是个人的忠实粉丝System.Timers.Timer。我更喜欢System.Threading.Timer我的任务是长的和/或非 gui 的,以及System.Windows.Forms.Timer短的 GUI 更新(它在 GUI 线程上触发,所以不需要Invoke任何东西)。

在严格的周期性计时器上启动任务的一个问题是它会触发,然后触发,然后触发......即使您之前启动的任务仍未完成(除非您停止/启动它或类似的)。方便的System.Threading.Timer方式是你可以启动它一次,然后在任务启动并完成后,再次启动它。

finally {
    new System.Threading.Timer((o) => { ... }, null, 60000, 0);
}
于 2013-03-07T07:50:23.480 回答