c#计时器问题

时间:2011-01-08 15:16:15

标签: c#

我有一个方法,我想每隔3秒在一个单独的线程中调用一个方法(将提到myFanc)

以下代码可以轻松完成,

 Timer myTimer = new Timer();
 myTimer.Elapsed += new ElapsedEventHandler( myFanc );
 myTimer.Interval = 3000;
 myTimer.Start();

上面的代码可能导致myFanc被调用,而另一个myFanc调用尚未完成

我的问题是我还希望myFanc在我调用她的agian之前完成,所以基本上我想在myFanc完成后每3秒调用一次单独的线程,我该怎么办?

我不介意解决方案是否不会使用Timer类,我只想让这种行为起作用..

6 个答案:

答案 0 :(得分:6)

将计时器的AutoReset属性设置为false,然后在事件处理程序结束时(即“myFanc”)再次调用计时器的Start方法。

答案 1 :(得分:1)

不要在调用“myfanc”的线程中使用定时器循环并使用

Thread.Sleep(3000);

插入所需的延迟。

答案 2 :(得分:1)

在myFunc的顶部放了这个

myTimer.Enabled = false;

并在完成时结束这个

myTimer.Enabled = true;

这将导致您在执行功能时暂时禁用定时器

答案 3 :(得分:1)

这是我使用的解决方案 - 感谢Jim

using System;
using System.Timers;
using System.Threading;

class myApp
{
    public static void Main()
{
      System.Timers.Timer myTimer = new System.Timers.Timer();
      myTimer.Elapsed += new ElapsedEventHandler( myFanc );
      myTimer.Interval = 1000;
      myTimer.AutoReset = false;
      myTimer.Start();

      while ( Console.Read() != 'q' )
      {
          ;    // do nothing...
      }
    }

public static void myFanc(object source, ElapsedEventArgs e)
{
    Console.Write("\r{0}", DateTime.Now);

    Thread.Sleep(3000); //the sleep here is just to test the method, wait to be finished before another call the myFanc method is being performed
    System.Timers.Timer myTimer = new System.Timers.Timer();
    myTimer.Elapsed += new ElapsedEventHandler(myFanc);
    myTimer.Interval = 1000;
    myTimer.AutoReset = false;
    myTimer.Start();

}

}

答案 4 :(得分:0)

我现在想到的两种方法

  1. 在myFanc方法中停止并启动计时器这确保每次运行之间有3秒
  2. 将你的代码包含在一个锁中的myFanc中,如果它没有完成,它将跳过一个转弯。
  3. 确保使用正确的计时器.. system.threading.timer是一个单独的线程。 windows.forms(或类似的东西)中的计时器类不是

答案 5 :(得分:0)

使用线程和Thread.Sleep(x),如此

Thread thread = new Thread(new ThreadStart(myTimer));
thread.Start();


void myTimer()
{
    while (!exit)
    {
        myFunc();
        Thread.Sleep(3000);
    }
}