我在VB.Net 2.0中有一个遗留的WinForms Mdi应用程序,我正在添加功能。其中一个补充是当当前时间接近指定值(截止日期)时需要提出的警告。我的目的是每小时检查一次,直到截止日期不到一小时,然后按指定的时间间隔显示警告,直到时间结束。
用户需要能够在截止日期之前甚至在截止日期之后继续使用该应用程序,但他们需要定期了解截止日期的接近程度。
应用程序尚未使用System.Threading,此时我对它的了解有限。我知道有3种不同的Timer()方法可用:
我的问题是,这是最好的方法吗?我试图使用线程计时器,但由于WinForms不是线程安全的,我试图访问另一个类时遇到运行时错误。是否值得使类/表单线程安全?我完全偏离了轨道吗?
感谢。
答案 0 :(得分:11)
这篇文章很好地解释了:
Comparing the Timer Classes in the .NET Framework Class Library
听起来像System.Windows.Forms.Timer就是你的选择。
我的指南:如果您希望计时器在主GUI线程上运行,请坚持使用Windows.Forms.Timer。如果可以在线程池线程上异步调用计时器,或者如果您不希望遇到System.Windows.Forms.Timer容易受到的小延迟,请使用System.Timers.Timer。 System.Threading.Timer具有与其他两个不同的接口,并且不是线程安全的;就个人而言,我不是粉丝。
答案 1 :(得分:6)
我只想使用Forms计时器。我想我读到它并不准确,但听起来你并不需要它。
答案 2 :(得分:2)
我同意Windows.Forms.Timer()是最适合这种情况的,因为它处理交叉线程编组问题。
一些有用的相关链接:
答案 3 :(得分:0)
好的,首先要做的事情......
如果您想向用户显示表单并在后台执行某些操作,我会使用BackgroundWorker类,之前它对我有用。 此外,你需要如前所述的调用方法,正如克里斯所说,它听起来比它实际上更难。
这是一个我认为会帮助你的链接。
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx
答案 4 :(得分:0)
System.Forms.Timer实际上使用Windows消息队列在主线程上工作。这使得它有点不透明,但由于你并不真正需要ms精度,所以它已经足够了。 您可以使用其他一个在单独线程上工作的计时器,但由于您需要激活在main中工作的winforms组件,您需要使用Form.Invoke或其他方式将事件传递给主线程 - 这也会导致一些延迟。 总之,当您需要激活基于winforms的组件时,请使用System.Forms.Timer。