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