【问题标题】:Which way is better, and how to pass parameters to windows.forms.timer哪种方式更好,以及如何将参数传递给 windows.forms.timer
【发布时间】:2013-05-27 18:23:38
【问题描述】:

我想要完成的事情如下:

我在计时器中有很多“检查(if/else if etc)”,他的间隔是 1000 毫秒,

有一个文本文件正在更新,计时器每 1000 毫秒读取一次并检查一些特定的更改,

在其中一种情况下,如果计时器为真,我需要等待 10 秒,然后读取另一个文本文件,然后继续执行计时器代码的其余部分。

但与此同时,计时器在这 10 秒内继续运行,并每 1 秒对所有其他条件和这 1 个条件进行检查。

我想做什么

如果我希望条件为真,我将启动一个间隔为 10 秒的新计时器,它将继续执行该特定部分的代码。

但我很难完成的是如何将参数传递给该计时器

newTimer.Start(int "parameter", string "parameter b", list<string> parameters c")

等等等等

或者如果您有任何其他想法,我会很高兴听到。

【问题讨论】:

  • async / await 让这大大简单了。

标签: c# .net winforms timer multitasking


【解决方案1】:

要传递参数,您始终可以使用Tuple

newTimer.Start(Tuple.Create(param1, param2, param3));

如果逻辑正确,您可能不需要两个计时器。

Timer *run every second*
    Check file

    If file has flag Then save in variable the current date + 10 seconds

    If current date > saved date Then Check the other file

【讨论】:

    【解决方案2】:

    您需要考虑System.Windows.Forms.Timer 将在 GUI 线程(运行包含表单的消息循环/泵的线程)上运行,因为它使用由 GUI 线程处理的窗口消息 (WM_TIMER)。因此,在您的表单中任何System.Windows.Forms.Timer 下运行的任何代码都将同步执行。因此,如果您启动一个新的 System.Windows.Forms.Timer 并阻塞 10 秒,那么您的所有其他计时器也将被阻塞(因为消息循环被阻塞)。

    考虑使用System.Threading.TimerSystem.Timers.Timer,因为它们在不同的线程上运行计时器回调。这样一来,您的代码将几乎按照您的意愿运行 - 方法将每隔一秒运行一次,无论天气如何,上一次调用已完成或仍处于阻塞状态(等待 10 秒)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2011-05-13
      • 2018-05-11
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多