System.Timers.Timer
クラスを使用して、Timer.Elapsed
イベントでタイマーを作成しています。問題は、Timer.Elapsed
イベントが、インターバル時間が経過した後に初めて起動されることです。
タイマーを開始した直後にTimer.Elapsed
イベントを発生させる方法はありますか?
System.Timers.Timer
クラスに関連するプロパティが見つかりませんでした。
Timer_Tick
メソッドを自分で呼び出すだけです。
Tickコールバックメソッドのパラメーターを処理したくない場合は、Timer_Tick
にあったコードを別のメソッドに配置し、Timer_TickからとTimer.Start()
呼び出しの直後から呼び出します
@Yahiaが指摘したように、 System.Threading.Timer
タイマーを使用することもできます。このタイマーは、初期遅延を0に設定できます。ただし、コールバックは実行されることに注意してくださいUIスレッドで実行されるWindows.Forms.Timer
のコールバックとは対照的に、別のスレッドで。したがって、 System.Threading.Timer
(正しく呼び出さずに)を使用してUIコントロールを更新すると、クラッシュ。
**ElapsedEventHandler**
パラメータがnullです。
この回答は遅れていますが、System.Timers.Timer
は100ミリ秒(デフォルトの間隔)以内に起動され、指定された間隔なしでTimer
オブジェクトを初期化するだけで、呼び出された関数内の間隔を任意に設定できます。 Windowsサービスで使用するものの例を次に示します。
private static Timer _timer;
protected override void OnStart(string[] args)
{
_timer = new Timer(); //This will set the default interval
_timer.AutoReset = false;
_timer.Elapsed = OnTimer;
_timer.Start();
}
private void OnTimer(object sender, ElapsedEventArgs args)
{
//Do some work here
_timer.Stop();
_timer.Interval = 50000; //Set your new interval here
_timer.Start();
}
System.Timers.Timer
でも試してみる
System.Threading.Timer T = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 30000);
これはすぐに開始します(最初の実行では0ミリ秒、後続の実行では30000ミリ秒)...
見る
http://msdn.Microsoft.com/en-us/library/system.threading.timer.aspx
http://msdn.Microsoft.com/en-us/library/2x96zfy7.aspx
(タイマーを開始した瞬間だけでなく)必要なときにいつでもイベントを発生できるようにしたい場合は、独自のMyTimerクラスにタイマーをカプセル化できます。このクラスは、元のTimerメソッドとプロパティを公開します。さらに、明示的に追加および削除するイベントを追加しました。このようにして、イベントにデリゲートを追加するたびに、プライベートMyTimerのイベントと元のタイマーElapsedイベントの両方に追加されます。これは、タイマーが通常の方法でElapsedをトリガーすることを意味しますが、RaiseElapsedを呼び出すイベントを手動でトリガーすることができます(コードを見るとはるかに簡単に聞こえます)。
public class MyTimer
{
Timer t = new Timer();
event ElapsedEventHandler timerElapsed;
public event ElapsedEventHandler Elapsed
{
add
{
t.Elapsed += value;
timerElapsed += value;
}
remove
{
t.Elapsed -= value;
timerElapsed -= value;
}
}
public double Interval
{
get
{
return t.Interval;
}
set
{
t.Interval = value;
}
}
public void Start()
{
t.Start();
}
public void Stop()
{
t.Stop();
}
public void RaiseElapsed()
{
if (timerElapsed != null)
timerElapsed(null, null);
}
}
Task.Run(() => { Timer_Elapsed(null, null); });
タイマーの作成/構成の後、私のためにうまくいった...
初めて、タイマーは1秒後に開始されます。その後、間隔は30秒ごとに変更されます...
//main function
Timer timer = new Timer(1000); //initial start after 1 second
timer.Elapsed += new ElapsedEventHandler(TimerElapsedMethod);
timer.Start();
}
private void TimerElapsedMethod(object sender, ElapsedEventArgs e)
{
Timer timer = (Timer)sender; // Get the timer that fired the event
timer.Interval = 30000; // Change the interval to whatever
.
.
.
}
AddHandlerを使用してVB.NETに実装しました
Public Class clsMain Inherits ServiceBase
Protected Overrides Sub OnStart(ByVal args() As String)
' Add code here to start your service. This method should set things
' in motion so your service can do its work.
gTimer.Interval = 1000
gTimer.Enabled = True
AddHandler gTimer.Elapsed, AddressOf gTimer_Elapsed
End Sub
'When the timer is elapsed this event will be fired
Protected Sub gtimer_Elapsed(ByVal source As Object, ByVal e As ElapsedEventArgs)
'Stop the timer and do some work
gTimer.Stop()
'Custom code
'Here
'Start to raise the elapsed event again
gTimer.Start()
End Sub
End Class