x间隔后取消定时器

时间:2012-12-11 12:51:24

标签: c# timer

我有一个计时器,应该以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);

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

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

2 个答案:

答案 0 :(得分:2)

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

也许是这样的:

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);
  }
}

<强> [编辑]

在审查代码时,我可能会锁定计时器的处理,以防止竞争条件。

    if (...)
    {
       lock(this)
       {
          if (timer != null) timer.Dispose();
          timer = null;
       }
     }

答案 1 :(得分: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();
    }
}