2011-01-08 73 views
3

我有,我想調用一個方法(將提爲myFanc)中分離式螺紋每3秒問題用C#定時器

的方法

下面的代碼可以伊斯利做到這一點,

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

的上面的代碼可能會導致myFanc被調用,而另一個調用myFanc尚未完成

我的問題是,我也希望myFanc完成之前,我會打電話給她的亞歷,所以基本上我想調用方法在分離線程myFanc完成後每3秒鐘一次,我該怎麼做?

如果解決方案將不使用Timer類,我不介意,我只是希望這種行爲的工作..

回答

6

將您的計時器的AutoReset屬性設置爲false,然後在事件處理程序的末尾(即「myFanc」),再次調用您的計時器的Start方法。

1

不要使用定時器,循環在線程中調用「myfanc」,並使用

Thread.Sleep(3000); 

插入所需的延遲。

+0

@Delashmate:如果你確實使用不同的線程了,我第二次這個建議 - 睡覺的第二個線程是處理延遲的首選方式。 – 2011-01-08 15:22:51

+0

我更喜歡不使用睡眠時,我可以.. – Delashmate 2011-01-08 15:28:56

+0

@Delashmate:在什麼推理?這是一個合適的使用thread.sleep – Kurru 2011-01-08 15:32:29

0

2種方法比我能想到的,現在

  1. 停止和啓動myFanc方法這將確保每次運行之間3秒
  2. 總結你的代碼myFanc鎖內內的計時器,這將只是如果還沒有完成,請跳過一圈。

請確保您使用正確的計時器.. system.threading.timer是一個單獨的線程。在Windows.Forms的(或類似的東西)的定時器類不是

1

在myFunc的頂部把這個

myTimer.Enabled = false; 

,並在年底的時候才完成把這個

myTimer.Enabled = true; 

這將導致您暫時禁用定時器功能正在執行

1

這是我使用的解決方案 - 感謝吉姆

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

} 

}

0

用螺紋和Thread.sleep代碼(X),像這樣

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


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