2011-06-16 7 views
3

送信者パラメータを.NETのsystem.timers.timerにどのように渡しますか?送信者パラメータを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

私はパラメータをスレッドに渡すようにオブジェクトまたはwindow.timerを渡すタグのプロパティを渡します – vrushali

答えて

1

あなたの行を保持する集約クラスを作成します。

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

を使用して

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

私はzabulusの方法を好むが、代替があります。 System.Timers.Timerから継承し、必要なものを保持できる独自の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

@ k4llは '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' 
} 
関連する問題