代码之家  ›  专栏  ›  技术社区  ›  Nick

哪个。要使用的网络计时器()

  •  6
  • Nick  · 技术社区  · 17 年前

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

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

    该应用程序不使用系统。目前,我对线程的了解仍然有限。我知道有3种不同的Timer()方法可用:

    • 系统。穿线。定时器(),
    • 窗户。形式。计时器()和
    • 系统。计时器。计时器()

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

    谢谢。

    5 回复  |  直到 17 年前
        1
  •  11
  •   Qwertie    17 年前

    这篇文章解释得很好:

    Comparing the Timer Classes in the .NET Framework Class Library

    听起来像是系统。窗户。形式。定时器就是为你准备的。

    我的建议是:如果你想让计时器在你的主GUI线程上运行,那就坚持使用Windows。形式。定时器。如果你的计时器可以在线程池线程上异步调用,或者你不想经历系统的小延迟。窗户。形式。定时器容易受影响,使用系统。计时器。定时器。系统。穿线。定时器的接口与其他两个不同,并且不是线程安全的;就我个人而言,我不是粉丝。

        2
  •  6
  •   Aaron Smith    17 年前

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

        3
  •  2
  •   Thomas Bratt    17 年前

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

    一些有用的相关链接:

        4
  •  0
  •   Dror Helper    17 年前

    系统。形式。定时器实际上是使用windows消息队列在主线程上工作的。这使得它有点不准确,但由于你并不真正需要ms精度,所以它已经足够好了。 您可以使用在单独线程上工作的其他计时器之一,但由于您需要激活在主线程中工作的winforms组件,因此需要使用Form.Invoke或其他方式将事件传递给主线程,这也会导致一些延迟。 总之,使用该系统。形式。需要激活基于winforms的组件时的计时器。

        5
  •  0
  •   sebagomez    17 年前

    好吧,先做第一件事。..

    如果你想向用户显示一个表单并在后台做一些事情,我会使用 BackgroundWorker 同学们,以前对我有用。 此外,您需要调用前面提到的方法,正如Chris所说,这听起来比实际更难。

    这里有一个链接,我认为它会帮助你。
    http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx