2011-06-16 2 views
3

Как передать параметр отправителя system.timers.timer в .NET?Как передать параметр отправителя в system.timers.timer

timer1[timer] = new System.Timers.Timer(interval); 
timer1[timer].AutoReset = true; 
timer1[timer].Elapsed += new ElapsedEventHandler(datatransferEvent); 
timer1[timer].Start(); 
GC.KeepAlive(timer1[timer]); 


private void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    try 
    { 
     serverreconnected.Stop(); 
     reconnect(_opcServer); 
    } 
    finally 
    { 
     serverreconnected.Start(); 
    } 
} 

Пример:

System.Threading.Timer timer1; 
timer1= new System.Threading.Timer(databaseTrensfer, row, dueTime, interval); 

public void databaseTrensfer(object row) 
{ 
    DataRow rowE = (DataRow)row; 
} 

строки перейти к параметру функции databaseTrensfer()

Я хочу передать параметр отправителя к событию.

Заранее спасибо.

+2

Хух? Это не твоя работа. Экземпляр таймера запускает событие. отправитель обычно содержит экземпляр обжига, но вы не всегда можете положиться на это. – leppie

+0

Я не совсем понимаю ваш вопрос. Параметр отправителя будет заполняться автоматически таймером отправки, когда событие будет поднято. – Falanwe

+0

Я хочу передать параметр, похожий на threading, передать объект или window.timer передать свойство тега – vrushali

ответ

1

создать класс агрегации, содержащий вашу строку.

class RowHolderEventArgs : EventArgs 
{ 
    public DataRow row; 
    public RowHolderEventArgs(DataRow row) 
    { 
     this.row = row; 
    } 
}; 
public delegate void RowHolderEvent(object sender, RowHolderEventArgs e); 
class RowHolder 
{ 
    public event RowHolderEvent Elapsed; 
    DataRow row; 
    public RowHolder(DataRow row, Timer timer) 
    { 
     this.row = row; 
     timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
    } 

    void timer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     if (this.Elapsed != null) 
     { 
      Elapsed(sender, new RowHolderEventArgs(row)); 
     } 
    } 
} 

использованием

timer1[timer] = new System.Timers.Timer(interval); 
rowHolder[timer] = new RowHolder(timer1[timer],row[timer]); 
rowHolder.Elapsed+=new RowHolderEvent(databaseTrensfer) 

public void databaseTrensfer(object sender, HolderEventArgs e) 
{ 
DataRow rowE = (DataRow)e.row; 
} 
9

Мне нравится zabulus метод используется, но есть альтернатива. Создайте свой собственный класс Timer, который наследуется от System.Timers.Timer и может содержать все, что вы хотите. Я решил использовать свойство основного объекта Tag, чтобы его можно было повторно использовать в других проектах.

public class MyTimer : System.Timers.Timer 
{ 
    public MyTimer(double interval) 
     : base(interval) 
    { 
    } 

    public object Tag { get; set; } 
} 

MyTimer timer; 
void test(object sender) 
{ 
    timer = new MyTimer(1); 
    timer.Tag = sender; 
    timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
} 

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    MyTimer timer = (MyTimer)sender; 
    object tag = timer.Tag; 
    // do whatever you want with tag 
} 

Затем позвоните по телефону test(with whatever value you want to pass).

+1

Голосование за ваш ответ было моим первым предложением, но я не ошибся в классах: System.Threading.Timer запечатан в отличие от System.Timers.Timer. – zabulus

+0

Привет, как мне преобразовать объект тега в строку? – k4lls

+0

@ k4lls либо 'timer.Tag.ToString()' или '(string) timer.Tag' –

1

А что-то вроде:

static Timer timer; 

static void Main(string[] args) 
{ 
    var row = default(DataRow); // Some row 
    timer = new Timer(30000); 
    timer.Elapsed += (_, __) => databaseTrensfer(row); 
} 

static void databaseTrensfer(DataRow row) 
{ 
    // Do something with 'row' 
} 
Смежные вопросы