it-swarm.com.de

Wie wird ein Timer ausgelöst? Ereignis sofort ausgelöst

Ich verwende die System.Timers.Timer-Klasse, um einen Timer mit einem Timer.Elapsed-Ereignis zu erstellen. Die Sache ist, dass das Timer.Elapsed-Ereignis zum ersten Mal erst nach Ablauf der Intervallzeit ausgelöst wird.

Gibt es eine Möglichkeit, das Timer.Elapsed-Ereignis direkt nach dem Starten des Timers zu aktivieren?

Ich konnte keine relevante Eigenschaft in der System.Timers.Timer -Klasse finden.

47
Otiel

Rufen Sie einfach die Methode Timer_Tick selbst auf.


Wenn Sie sich nicht mit den Parametern der Tick-Callback-Methode beschäftigen möchten, geben Sie einfach den Code, der sich in Ihrem Timer_Tick befindet, in eine andere Methode ein und rufen Sie ihn vom Timer_Tick aus und direkt nach dem Aufruf von Timer.Start() auf


Wie von @Yahia ausgeführt, können Sie auch den System.Threading.Timer timer verwenden, den Sie für eine anfängliche Verzögerung auf 0 einstellen können. Beachten Sie jedoch, dass der Rückruf in einem anderen Thread ausgeführt wird als im der Rückruf auf dem Windows.Forms.Timer, der im UI-Thread ausgeführt wird. Wenn Sie also Steuerelemente der Benutzeroberfläche mit System.Threading.Timer aktualisieren (ohne korrekt aufzurufen), stürzt dies ab.

28
George Duckett

Ich habe gerade den **ElapsedEventHandler** mit Null-Parametern aufgerufen.

18
user1791983

ich bin nicht sicher über System.Timers.Timer, aber versuchen Sie es

System.Threading.Timer T = new System.Threading.Timer(new TimerCallback(DoSomething), null, 0, 30000);

Dies beginnt sofort (0 Millisekunden für den ersten Durchlauf, 30000 Millisekunden für Folgefolgen).

sehen
http://msdn.Microsoft.com/de-de/library/system.threading.timer.aspx
http://msdn.Microsoft.com/de-de/library/2x96zfy7.aspx

10
Yahia

Ich weiß, dass diese Antwort zu spät ist, aber wenn Sie möchten, dass Ihr System.Timers.Timer innerhalb von 100 ms (Standardintervall) ausgelöst wird, können Sie das Timer-Objekt einfach ohne ein angegebenes Intervall initialisieren. Dann können Sie das Intervall innerhalb der aufgerufenen Funktion auf beliebig festlegen. Hier ein Beispiel, was ich in meinem Windows-Dienst verwende:

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();
}
9
John Odom

Wenn Sie möchten, dass das Ereignis jederzeit ausgelöst werden kann (nicht nur zu dem Zeitpunkt, zu dem Sie den Timer starten), können Sie einen Timer in Ihre eigene MyTimer-Klasse einkapseln. Diese Klasse macht die ursprünglichen Timer-Methoden und -Eigenschaften verfügbar. Außerdem habe ich ein Event mit explizitem Hinzufügen und Entfernen hinzugefügt. Auf diese Weise wird jedes Mal, wenn Sie dem Ereignis einen Delegaten hinzufügen, dies sowohl dem privaten MyTimer-Ereignis als auch dem ursprünglichen Timer-Ereignis Elapsed hinzugefügt. Dies bedeutet, dass der Timer Elapsed auf die übliche Weise auslöst, Sie können jedoch das Ereignis RaiseElapsed aufrufen, das den Aufruf von RaiseElapsed auslöst.

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

Nach der Timer-Erstellung/Konfiguration funktionierte es gut für mich ...

3
ADNnetPonzo

Zum ersten Mal startet der Timer nach 1 Sekunde. Danach wird das Intervall alle 30 Sekunden oder was auch immer geändert.

    //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
        .
        .
        .
    }
2
Hamad

Hier ist die einfache Antwort. (Vorausgesetzt, Sie verwenden ein Windows-Formular)

Nachdem Sie Ihr Zeitsteuerelement in Ihr Formular gezogen haben, setzen Sie die aktivierte Eigenschaft auf true und die Interval-Eigenschaft auf den gewünschten Wert. (100 ist die Standardeinstellung und startet das Tick-Ereignis sofort.)

 enter image description here

Überprüfen Sie dann in Ihrem Tick-Ereignis einfach den Wert der Interval-Eigenschaft. Wenn es nicht Ihr gewünschter Wert ist, stellen Sie ihn ein. So einfach ist das. Dasselbe kann in Ihrem C # -Code erreicht werden, wenn Sie einen Timer direkt erstellen.

 enter image description here

0
puffgroovy

Ich habe in VB.NET mit AddHandler implementiert

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