Forum: PC-Programmierung C# - Timer kann nicht gestoppt werden


von paula (Gast)


Lesenswert?

Hi,

folgendes Problem habe ich in meiner C# Applikation. Ich benutzte einen 
Timer mit einem EventHandler. Für die Synchronisation zwischen C# 
Applikation und der GUI wird die Methode Invoke eingesetzt.
1
        delegate void InvokeProc();
2
        System.Timers.Timer Timer;
3
4
        public Form()
5
        {
6
            this.Timer          = new System.Timers.Timer();
7
            this.Timer.Interval = 2;
8
            this.Timer.Elapsed += new ElapsedEventHandler(TimerEvent);
9
            this.Timer.Enabled  = false;
10
        }
11
12
        public void TimerEvent(object sender, ElapsedEventArgs e)
13
        {
14
            try
15
            {
16
                this.Invoke(new InvokeProc(OnTimer));
17
            }
18
            catch { };
19
        }
20
21
        public void OnTimer()
22
        {
23
24
          // do somthing //
25
        }

Egal was ich tue den Timer kann ich nicht stoppen.
1
this.Timer.Dispose();
2
this.Timer.Stop();
3
this.Timer.Enables = false;

Alle drei Möglichkeiten habe ich ausprobiert. Woran könnte dies liegen ? 
Gibt es eine Möglichkeit den Timer überhaupt zu stoppen ?

von Farin (Gast)


Lesenswert?

Hi paula

Ich glaube dein Problem liegt darin dass du den Timer in einer anderen 
Klasse startest. Schau mal wie die Modifier des Timers gesetzt sind. 
Ausserdem solltest du dir im Klaren darüber sein dass du im Konstruktor 
den Timer schon wieder disablest ohne dass er je laufen kann. Das von 
dir beschriebene Verhalten soltle also gar nicht auftreten können.

Ausserdem hast du einen Schreibfehler beim zweiten geposteten Codeblock. 
Der Command heisst Enabled! nicht EnableS... Wenn du mit Visual Studio 
arbeitest solltest du zuerst auf Syntaxfehler prüfen. Ein bekannter 
Fehler ist, wenn wie oben Fehler im Code sind und einfach eine alte 
Version ausgeführt wird.
Kannst du das mal nachprüfen? ;-)

Gruss

Farin

von paula (Gast)


Lesenswert?

Hallo Farin,

ich habe mich da vertippt. Es müsste this.Timer.Enabled = false; heisen. 
Ich  habe in meiner Applikation nur eine Klasse.

von paula (Gast)


Lesenswert?

Nach einer gewissen Bedingung in der OnTimer Methode sollte der Timer 
gestoppt werden.

von Rocky B. (bitrocker)


Lesenswert?

Was verwendest du? Console, Form oder WPF Application?

von paula (Gast)


Lesenswert?

Ich verwende Form.

von Rocky B. (bitrocker)


Lesenswert?

1
public partial class Form1 : Form
2
{     
3
    delegate void InvokeProc();
4
    Timer t;
5
6
    int c = 0;
7
8
    public Form1()
9
    {
10
        t = new Timer();
11
        t.Interval = 2;
12
        t.Tick += new EventHandler(TimerEvent);
13
        t.Enabled  = true;
14
    }
15
16
    public void TimerEvent(object senden, EventArgs e)
17
    {
18
        try
19
        {
20
            this.Invoke(new InvokeProc(OnTimer));
21
        }
22
        catch { };
23
    }
24
25
    public void OnTimer()
26
    {
27
        // do somthing //
28
29
        // example term
30
        c++;                     
31
        if (c > 5)
32
        {
33
            t.Enabled = false;  // stop timer
34
            t.Dispose();        // disposing timer object
35
        }
36
        else
37
        {
38
            MessageBox.Show("c = " + c.ToString());
39
        }            
40
    }
41
42
    private void Form1_Load(object sender, EventArgs e)
43
    {
44
45
    }
46
}

So gehts. Viel Spass damit =)

von paula (Gast)


Lesenswert?

Danke für deine Hilfe. So geht es auch nicht. Die OnTimer Methode wird 
immer wieder ausgeführt.

von paula (Gast)


Lesenswert?

Ich habe noch so initialisiert:
1
            this.Timer          = new System.Timers.Timer();
2
            this.Timer.Interval = 2;
3
            this.Timer.Elapsed += new ElapsedEventHandler(TimerEvent);
4
            this.Timer.Enabled  = false;

Die Eigenschaft Tick kann ich nicht auswählen.

von Rocky B. (bitrocker)


Lesenswert?

Richtig, du initialisierst auch den Consolen Timer mit 
"System.Timers.Timer Timer", statt den Forms Timer zu verwenden. Zudem 
sprichst du den Timer mit "this" an, obwohl er schon bekannt gemacht 
wurde.

von Rocky B. (bitrocker)


Lesenswert?

Und um Missverständnisse im Code zu vermeiden, solltest du nicht den 
selben Variablennamen verwenden, wie den Klassennamen. In deinem Fall:
1
System.Timers.Timer Timer;

Denn die Variable "Timer" wurde in deinem Code nie verwendet bzw. 
initialisiert.

von paula (Gast)


Lesenswert?

So jetzt funktioniert die Applikation so wie sie sollte. Danke!

von Rocky B. (bitrocker)


Lesenswert?

Gern geschehen (!)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.