-2

我有一个创建线程 .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 完成。

4

3 回答 3

0

假设您的计时器持有者类有 name 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
}
于 2012-10-31T07:42:18.580 回答
0

我使用此代码。

尝试进入/退出。在这种情况下无需停止/重新启动计时器;重叠调用不会立即获取锁并返回。

object lockObject = new object();

private void ProcessTimerEvent(object state) 
 {
  if (Monitor.TryEnter(lockObject))
  {
   try
   {
   // Work here
   }
   finally
    {
   Monitor.Exit(lockObject);
    }
   }
  }
于 2012-11-07T10:23:37.150 回答
-1

要停止计时器,您应该 Timer.Change 方法

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 是常数

于 2012-10-31T07:56:13.240 回答