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