0

我有一个计时器,它应该以 500 毫秒的间隔运行 x 次。目前我的代码看起来像这样:

 var i = 0;
 var times = 10;
 timer = new System.Threading.Timer(_ =>
 {
    if (timer == null || i >= times)
        return;

    Console.WriteLine("Run " + i);

    if (i < times - 1)
        i++;
    else
    {
        timer.Dispose();
        timer = null;
    }
 }, null, 500, 500);

如果我确保在计时器变量中只创建和引用一个计时器,这是取消计时器的可靠方法吗?

间隔的数量在运行时是可变的。

4

2 回答 2

2

处理计时器看起来很安全。我会将 i 和 times 变量设为私有,而不是方法的一部分。这会创建更快的代码。此外,计时器委托可能同时在不同线程上运行的可能性很小,请参阅http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx,所以我可能会使用 Interlocked .增量法。

也许是这样的:

class Foo
{
  volatile int runCount;
  int maxRunCount;
  Timer timer;

  void RunFor(int max)
  {
    maxRunCount = max;
    timer = new System.Threading.Timer(_ =>
    {
      if (timer == null) return;
      Console.WriteLine("Run " + runCount);

      if (Interlocked.Increment(ref runCount) == maxRunCount)
      {
          timer.Dispose();
          timer = null;
      }
    }, null, 500, 500);
  }
}

[编辑]

在查看代码时,我可能会在 dispose 计时器周围加锁,以防止出现竞争条件。

    if (...)
    {
       lock(this)
       {
          if (timer != null) timer.Dispose();
          timer = null;
       }
     }
于 2012-12-11T13:42:47.703 回答
1

您应该改用System.Timers.Timer该类...
它同时支持Stop()Start()方法。

简短的例子:

System.Timers.Timer timer = new System.Timers.Timer();
var i = 0;
var times = 10;


public SetupTimer()
{
    timer.Interval = 500;
    timer.Elapsed += OnTimerElapsed;
    timer.Start();
}

private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // Logic

    if (i > times)
    {
       timer.Stop();
    }
}
于 2012-12-11T13:42:32.300 回答