我有一个方法,我想每隔3秒在一个单独的线程中调用一个方法(将提到myFanc)
以下代码可以轻松完成,
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler( myFanc );
myTimer.Interval = 3000;
myTimer.Start();
上面的代码可能导致myFanc被调用,而另一个myFanc调用尚未完成
我的问题是我还希望myFanc在我调用她的agian之前完成,所以基本上我想在myFanc完成后每3秒调用一次单独的线程,我该怎么办?
我不介意解决方案是否不会使用Timer类,我只想让这种行为起作用..
答案 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)
我现在想到的两种方法
确保使用正确的计时器.. 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);
}
}