C# 如何在线程延迟后执行该方法。计时器?

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

我有一个类创建了一个threading.timer

我想在这里面处理定时器,然后定时器工作

在我的TickEvent中,我提出了一种方法,但不要抱怨这一点

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