web-dev-qa-db-ja.com

timer.Elapsedイベントをすぐに起動する方法

System.Timers.Timerクラスを使用して、Timer.Elapsedイベントでタイマーを作成しています。問題は、Timer.Elapsedイベントが、インターバル時間が経過した後に初めて起動されることです。

タイマーを開始した直後にTimer.Elapsedイベントを発生させる方法はありますか?

System.Timers.Timer クラスに関連するプロパティが見つかりませんでした。

51
Otiel

Timer_Tickメソッドを自分で呼び出すだけです。


Tickコールバックメソッドのパラメーターを処理したくない場合は、Timer_Tickにあったコードを別のメソッドに配置し、Timer_TickからとTimer.Start()呼び出しの直後から呼び出します


@Yahiaが指摘したように、 System.Threading.Timer タイマーを使用することもできます。このタイマーは、初期遅延を0に設定できます。ただし、コールバックは実行されることに注意してくださいUIスレッドで実行されるWindows.Forms.Timerのコールバックとは対照的に、別のスレッドで。したがって、 System.Threading.Timer (正しく呼び出さずに)を使用してUIコントロールを更新すると、クラッシュ。

30
George Duckett

**ElapsedEventHandler**パラメータがnullです。

18
user1791983

この回答は遅れていますが、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();
}
11
John Odom

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

10
Yahia

(タイマーを開始した瞬間だけでなく)必要なときにいつでもイベントを発生できるようにしたい場合は、独自の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); });

タイマーの作成/構成の後、私のためにうまくいった...

4
ADNnetPonzo

初めて、タイマーは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
        .
        .
        .
    }
3
Hamad

ここに簡単な答えがあります。 (Windowsフォームを使用していると仮定)

タイマーコントロールをフォームにドラッグした後、enabledプロパティをtrueに設定し、Intervalプロパティを初期値に設定します。 (100がデフォルトで、tickイベントをすぐに開始します)

enter image description here

次に、ティックイベント内で、Intervalプロパティの値を確認します。目的の値でない場合は、設定します。 それは簡単です。オンザフライでタイマーを作成する場合、C#コードでも同じことが実現できます。

enter image description here

0
puffgroovy

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
0
developer9