2013-10-02 5 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

Вы можете использовать лямбда-выражение:

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

Проблема заключается в том, когда я прохожу метод работы в методе WorkAtInterval как tmr.Elapsed + = новый ElapsedEventHandler (работа), у меня есть ошибка, что там написано «имя метода, как ожидается,» – user843681

+0

@ user843681 Это потому, что ' ElapsedEventHandler' и 'Action ' не имеют такой же подписи. Вам нужно будет обратиться к этому. – Servy

+0

@servy Я знаю, что проблема заключается в том, что когда я создаю ту же подпись, что и ElapsedEventHandler, я не могу передать параметр функции, которую я хочу выполнить больше. – user843681

0

Решение, как это. Подпись WorkAtInterval должна соответствовать сигнатуре ElapsedEventHandler. А затем в главной функции вызов должен выполняться с помощью анонимной функции.

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(); 
     } 
Смежные вопросы