6

我在 VB.Net 2.0 中有一个旧版 WinForms Mdi 应用程序,我正在向其中添加功能。其中一项新增功能是在当前时间接近指定值(截止日期)时需要发出警告。我的意图是每小时检查一次时间,直到距离截止日期不到一小时,然后以指定的时间间隔显示警告,直到时间结束。

用户需要能够在截止日期之前甚至之后继续使用应用程序,但他们需要定期了解截止日期的临近。

该应用程序尚未使用 System.Threading,目前我对它的了解有限。我知道有 3 种不同的 Timer() 方法可用:

  • System.Threading.Timer(),
  • Windows.Forms.Timer() 和
  • System.Timers.Timer()

我的问题是,这是最好的方法吗?我尝试使用线程计时器,但由于 WinForms 不是线程安全的,我在尝试访问另一个类时遇到了运行时错误。使类/表单线程安全是否值得?我完全偏离轨道了吗?

谢谢。

4

5 回答 5

11

这篇文章解释得很好:

比较 .NET Framework 类库中的计时器类

听起来 System.Windows.Forms.Timer 适合您。

我的指导方针:如果您希望计时器在您的主 GUI 线程上运行,请坚持使用 Windows.Forms.Timer。如果可以在线程池线程上异步调用您的计时器,或者如果您不想体验 System.Windows.Forms.Timer 容易遭受的小延迟,请使用 System.Timers.Timer。System.Threading.Timer 具有与其他两个不同的接口,并且不是线程安全的;就个人而言,我不是粉丝。

于 2008-10-10T16:03:35.857 回答
6

我只会使用表单计时器。我想我读到它并不准确,但听起来你不需要它。

于 2008-10-10T15:36:40.153 回答
2

我同意 Windows.Forms.Timer() 最适合这种情况,因为它可以处理跨线程编组问题。

一些有用的相关链接:

于 2008-10-11T20:54:07.173 回答
0

好吧,首先,首先...

如果您想向用户显示表单并在后台执行某些操作,我会使用BackgroundWorker类,它以前对我有用。此外,您需要前面提到的调用方法,正如 Chris 所说,这听起来比实际上更难。

这是我认为可以帮助您的链接。
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

于 2008-10-10T16:04:52.780 回答
0

System.Forms.Timer 实际上使用 Windows 消息队列在主线程上工作。这使它有些不准确,但是由于您实际上并不需要 ms 精度,因此已经足够了。您可以使用在单独线程上工作的其他计时器之一,但由于您需要激活在主线程中工作的 winforms 组件,您需要使用 Form.Invoke 或其他方式将事件传递给主线程 -这也会导致一些延迟。总之,当您需要激活基于 winforms 的组件时,请使用 System.Forms.Timer。

于 2008-10-10T16:09:35.937 回答