GUI优先于定时器C#

时间:2013-03-07 06:17:31

标签: c# user-interface timer

我有一个包含多个计时器的Forms应用程序,它们都在不同的时间执行任务,但我现在已经开始在“不太好”的计算机上遇到问题 - 计算机。我的问题是,GUI似乎并没有考虑到我需要的时间。只需一个简单的按钮点击一个非常小的任务可能需要很长时间。而且我觉得它的“推动”本身就会受到影响。那么现在我的问题是,有没有办法在计时器上推广GUI?例如,如果GUI需要工作,请跳过勾号? (没有计时器是重要的,它不能跳过某些时间)。或者还有另一种方法可以让GUI工作吗? 顺便说一句,使用System.Timers.Timer,这是对ex。System.Windows.Forms.Timer的正确选择。

4 个答案:

答案 0 :(得分:1)

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

  

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

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

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

答案 1 :(得分:1)

使用线程

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

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

我希望这会有所帮助:)

答案 2 :(得分:1)

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

它听起来并不那么难,只读了一些tutorials并且瞧瞧。

答案 3 :(得分:0)

如果你想在你的计时器事件中启动一些lenghty任务,最好在一个单独的线程中完成。最简单/最简单的方法是这样的:

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);
}