c#计时器出现问题
我有一个方法,我想每3秒钟在单独的线程中调用一个方法(将提到myFanc) 下面的代码很容易做到c#计时器出现问题,c#,C#,我有一个方法,我想每3秒钟在单独的线程中调用一个方法(将提到myFanc) 下面的代码很容易做到 Timer myTimer = new Timer(); myTimer.Elapsed += new ElapsedEventHandler( myFanc ); myTimer.Interval = 3000; myTimer.Start(); 上述代码可能导致调用myFanc,而对myFanc的另一个调用尚未完成 我的问题是,我还希望在再次调用myFanc之前完成myFanc,所以基
Timer myTimer = new Timer();
myTimer.Elapsed += new ElapsedEventHandler( myFanc );
myTimer.Interval = 3000;
myTimer.Start();
上述代码可能导致调用myFanc,而对myFanc的另一个调用尚未完成
我的问题是,我还希望在再次调用myFanc之前完成myFanc,所以基本上我希望在myFanc完成后每隔3秒在单独的线程中调用该方法,我该如何做
我不介意解决方案是否不使用Timer类,我只想让这种行为起作用。不要使用计时器,在线程中循环调用“myfanc”并使用
插入所需的延迟。将计时器的
AutoReset
属性设置为false,然后在事件处理程序的末尾(即“myFanc”)再次调用计时器的Start
方法。这是我现在无法想象的两种方法
确保使用正确的计时器。。system.threading.timer是一个单独的线程。windows.forms中的timer类(或类似的东西)不在myFunc的顶部
myTimer.Enabled = false;
当它结束的时候,把这个
myTimer.Enabled = true;
这将导致在函数执行时临时禁用计时器这是我使用的解决方案-感谢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();
}
}使用一个线程和一个线程。像这样睡觉(x)
@Delashmate:如果您确实已经在使用不同的线程,我支持这个建议-休眠第二个线程是处理延迟的首选方式。@Delashmate:基于什么理由?这是线程的适当使用。sleep@Jim线程睡眠消耗cpu吗?如果是这样,那么它就不是优雅的solutionThread。睡眠暂停线程,因此它不会消耗CPU@Delashmate事件与Thread.Sleep无关。您可以通过暂停线程十秒钟(10000)来检查进程的CPU消耗是否为0…为什么?它非常适合按照这里的要求引入滞后
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();
}
Thread thread = new Thread(new ThreadStart(myTimer));
thread.Start();
void myTimer()
{
while (!exit)
{
myFunc();
Thread.Sleep(3000);
}
}