C# 如何在线程延迟后执行该方法。计时器?
我有一个类创建了一个threading.timer 我想在这里面处理定时器,然后定时器工作 在我的TickEvent中,我提出了一种方法,但不要抱怨这一点C# 如何在线程延迟后执行该方法。计时器?,c#,.net,multithreading,timer,C#,.net,Multithreading,Timer,我有一个类创建了一个threading.timer 我想在这里面处理定时器,然后定时器工作 在我的TickEvent中,我提出了一种方法,但不要抱怨这一点 void MyTimer_Tick(object sender, EventArgs e) { if(value) MyFunction(); } 计时器必须停止,直到MyFunction完成。假设计时器持有者类的名称为MyTimer。您需要的是定义方法Stop,该方法将处理Threading.Timer并关闭事件引发 publi
void MyTimer_Tick(object sender, EventArgs e)
{
if(value)
MyFunction();
}
计时器必须停止,直到MyFunction完成。假设计时器持有者类的名称为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);
}
}
然后将勾号事件发送器强制转换为计时器对象,并在处理事件时停止计时器。处理后再次启动计时器
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
}
要停止计时,你应该
dueTime指定Timeout.Infinite以防止计时器重新启动
period指定超时。无限可禁用周期信号
Timeout.Infinite是-1的常量
我使用这个代码
尝试进入/退出。在这种情况下,无需停止/重新启动计时器;重叠调用不会获得锁并立即返回
object lockObject = new object();
private void ProcessTimerEvent(object state)
{
if (Monitor.TryEnter(lockObject))
{
try
{
// Work here
}
finally
{
Monitor.Exit(lockObject);
}
}
}
现在还不清楚你的意思是什么——如果你扔掉了计时器,那么它当然不会工作。为什么不在计时器执行后处理掉呢?如果你能编辑以澄清你的问题,这会有所帮助。我意识到英语可能不是你的第一语言,但要努力让自己更清楚,否则很难帮助你。您还应该指定您正在使用哪种计时器,以及您正在编写哪种应用程序。@JonSkeet似乎正在使用System.Windows.Forms.Timer,因为只有该计时器具有滴答事件。。另一个仍然没有clear@JonSkeet当前位置我编辑我的问题。。我使用线程。计时器。。。我使用timer.dispose,但不为我工作。但不为我工作仍然是非常模糊的。你看过我链接到的关于如何提出好问题的页面了吗?@DmitryDovgopoly你是天才,它也没有滴答声event@ar.gorgin为什么不改为切换到System.Timers.Timer?谢谢,但我应该在什么时候使用方法更改?我希望在MyFunction之前停止计时器。\u timer.Change1,Timeout.Infinite;这不会停止计时器-它将在一毫秒内再次调用回调。然后,计时器将再次设置为一个或多个调用。Etc@DmitryDovgopoly它将运行一次,回调将被执行,计时器将被更改为再次运行MyFunction@DmitryDovgopoly这也不起作用,因为TimerCallback具有签名无效对象
public bool Change(int dueTime, int period)
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));
}
}
object lockObject = new object();
private void ProcessTimerEvent(object state)
{
if (Monitor.TryEnter(lockObject))
{
try
{
// Work here
}
finally
{
Monitor.Exit(lockObject);
}
}
}