2013-10-02 37 views
-2

我有一個方法使用Timer類來調用方法並在特定間隔上執行它。具有傳遞參數的計時器類和調用方法

private Timer tmr = new Timer(); 
    public void WorkAtInterval(long interval, Action<object> work) 
       { 
        //heartbeat in miliseconds 
        tmr.Interval = interval; 
        tmr.Start(); 
        tmr.Elapsed += new ElapsedEventHandler(work); 
       } 

我已經定義了國際上被稱爲像這樣的功能:在我的主要功能

private static void WorkSample (object interval) 
     { 
      Console.WriteLine("The interval is: {0}",interval); 
     } 

並最終:

static void Main(string[] args) 
     { 
      HeartBeat heart = new HeartBeat(); 

      var interval = heart.HeartBeatInterval; 

      heart.WorkAtInterval(interval,sampleWork(interval)); 

      Console.Read(); 
     } 

不幸的是,這甚至不會編譯。我對代表們不是很瞭解。關於如何讓這個工作成功的建議?

回答

0

您可以使用lambda表達式:

heart.WorkAtInterval(interval, x => WorkSample(interval)); 
+0

問題是,當我通過在WorkAtInterval方法tmr.Elapsed + =新ElapsedEventHandler(工作)的方法的工作,我有錯誤,說:「方法名,預計」 – user843681

+0

@ user843681這是因爲' ElapsedEventHandler'和'Action '不具有相同的簽名。你需要解決這個問題。 – Servy

+0

@servy我意識到這一點,問題是當我創建與ElapsedEventHandler相同的簽名時,我無法將參數傳遞給我想要執行的函數。 – user843681

0

解決的辦法是這樣的。 WorkAtInterval的簽名必須符合簽名ElapsedEventHandler。然後在Main函數中,調用必須由匿名函數正確完成。

public void WorkAtInterval(long interval, Action<object,EventArgs> work) 
      { 
       //heartbeat in miliseconds 
       tmr.Interval = interval; 
       tmr.Start(); 
       tmr.Elapsed += new ElapsedEventHandler(work); 
      } 

private static void sampleWork(object interval) 
     { 
      Console.WriteLine("The interval is: {0}",interval); 
     } 


static void Main(string[] args) 
     { 
      HeartBeat heart = new HeartBeat(); 

      var interval = heart.HeartBeatInterval; 

      heart.WorkAtInterval(interval,(o,s) => sampleWork(interval)); 

      Console.Read(); 
     }