如何在线程.timer中延迟后执行方法?

时间:2012-10-31 07:34:07

标签: c# .net multithreading timer

我有一个类创建了线程.timer

  System.Threading.Timer timer;
  TimerCallback cb = new TimerCallback(ProcessTimerEvent);
    timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds));
}

private void ProcessTimerEvent(object obj)
{
    if (Tick != null)
        Tick(this, EventArgs.Empty);
}

我想在其中部署Timer然后定时器工作。

在我的TickEvent中我执行了一个方法,但是没有对此进行编译。

 void MyTimer_Tick(object sender, EventArgs e)
{
 if(value)
   MyFunction();
}

必须停止计时器直到MyFunction完成。

3 个答案:

答案 0 :(得分:0)

假设您的计时器持有者类名为MyTimer。你需要的是定义方法Stop,它将处理你的Threading.Timer并关闭事件提升。

public class MyTimer
{    
    System.Threading.Timer timer;
    bool enabled;
    TimeSpan interval;
    public event EventHandler Tick;

    public MyTimer(TimeSpan interval)
    {
        enabled = true;
        this.interval = interval;
        timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds);
    }

    private void TimerCallback(object state)
    {
        if (!enabled)
           return;

        if (Tick != null)
            Tick(this, EventArgs.Empty);          
    }

    public void Stop()
    {
        timer.Dispose();
        timer = null;
        enabled = false;
    }

    public void Start()
    {
        enabled = true;
        timer = new Timer(TimerCallback, null, 1000, (int)interval.TotalSeconds);
    }
}

然后将Tick事件发送者强制转换为您的计时器对象,并在处理事件时停止计时器。再次处理启动计时器后。

void MyTimer_Tick(object sender, EventArgs e)
{
  MyTimer timer = (MyTimer)sender;
  timer.Stop(); // tick events will not be raised
  if(value)
     MyFunction();

  timer.Start(); // start timer again
}

答案 1 :(得分:0)

我使用此代码。

TryEnter /退出。在这种情况下无需停止/重启计时器;重叠的呼叫不会获得锁定并立即返回。

object lockObject = new object();

private void ProcessTimerEvent(object state) 
 {
  if (Monitor.TryEnter(lockObject))
  {
   try
   {
   // Work here
   }
   finally
    {
   Monitor.Exit(lockObject);
    }
   }
  }

答案 2 :(得分:-1)

要停止计时器Timer.Change Method

public bool Change(int dueTime, int period)
  

dueTime指定Timeout.Infinite以防止计时器重新启动。

     

period指定Timeout.Infinite禁用定期信令。

void MyTimer_Tick(object sender, EventArgs e)
{
    if(value)
    {
        //this stop the timer because dueTime is -1
        _timer.Change(Timeout.Infinite, Timeout.Infinite);
        MyFunction();
        //this start the timer
        _timer.Change(Convert.ToInt64(this.Interval.TotalSeconds), Convert.ToInt64(this.Interval.TotalSeconds));
    }
}
  

Timeout.Infinite恒定为-1