Laden...

C# EasyTimer beenden?

Erstellt von Krabbelfiechle vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.139 Views
Thema geschlossen
K
Krabbelfiechle Themenstarter:in
1 Beiträge seit 2014
vor 10 Jahren
C# EasyTimer beenden?

Hallo alle zusammen,

nachdem ich keinen passenden Beitrag gefunden habe stelle ich nun die Frage:

Ich benutze für mein Chat Programm den EasyTimer, der alle 3 Sekunden in einer Datenbank nachschaut ob ein neuer Eintrag für den aktuellen Chat vorhanden ist.
Wenn ich einen Chat öffne, dann Funktioniert der EasyTimer auch gut, wenn ich jetzt aber einen Chat mit einer Person schließe, dann stürtzt mir das Programm ab da die Schleife des EasyTimers weiter läuft aber die Instanz auf die sie verwendet wird nicht mehr vorhanden ist.

        public void Time()
        {

            EasyTimer.SetInterval(() =>
            {
                textBox2.Invoke((MethodInvoker)(() => textBox2.Text = this.Aktualisierung()));
            }, 3000);   
        }

Fehlermeldung:
Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

Wie kann ich den EasyTimer richtig beenden?
Ich versuche es mit Hilfe dieser Seite :
EasyTimer - JavaScript style setTimeout and setInterval in C#
Wie kann ich den Timer richtig beenden aber nur für das Chat Fenster das ich momentan wirklich offen habe?

        public static class EasyTimer
        {
            public static IDisposable SetInterval(Action method, int delayInMilliseconds)
            {

           
                            
               
                
                System.Timers.Timer timer = new System.Timers.Timer(delayInMilliseconds);
                timer.Elapsed += (source, e) =>
                {
                    method();
                };

                timer.Enabled = true;
                timer.Start();

                // Returns a stop handle which can be used for stopping
                // the timer, if required
                return timer as IDisposable; 
                
               
            }

            public static IDisposable SetTimeout(Action method, int delayInMilliseconds)
            {
                System.Timers.Timer timer = new System.Timers.Timer(delayInMilliseconds);
                timer.Elapsed += (source, e) =>
                {
                  
                        method();
                   
                };

                timer.AutoReset = false;
                timer.Enabled = true;                
               
                timer.Start();

                // Returns a stop handle which can be used for stopping
                // the timer, if required
                return timer as IDisposable;
            }
        }

        public string Aktualisierung()
        {



            this.ichErmitteln();
            MySqlConnection connection = new MySqlConnection(myConnectionString);
            MySqlCommand kommando = connection.CreateCommand();
            kommando.CommandText = "SELECT Text, Zeitpunkt, gelesen FROM techchat.nachrichten WHERE (Empfaenger = '" + empfaenger + "'  AND Sender = '" + Ich + "') OR (Sender = '" + empfaenger + "' AND Empfaenger  = '" + Ich + "') and gelesen = 1";
            MySqlDataReader leser;
            connection.Open();
            leser = kommando.ExecuteReader();

            string Text;
            string Zeitpunkt;
            string Ausgabe2 = "";

            while (leser.Read())
            {
                Text = leser.GetValue(0).ToString();
                Zeitpunkt = leser.GetValue(1).ToString();
                Ausgabe2 = Ausgabe2 + "< " + Zeitpunkt + " - "+ Ich + " >  " + Text + Environment.NewLine;
            }
            kommando.CommandText = "UPDATE techchat.nachrichten SET gelesen = 1 WHERE gelesen = 0 and Empfaenger ='" + empfaenger + "'";
            kommando.BeginExecuteNonQuery();
            connection.Close();
            return Ausgabe2;

            
        }
        
        public void Time()
        {

            EasyTimer.SetInterval(() =>
            {
                textBox2.Invoke((MethodInvoker)(() => textBox2.Text = this.Aktualisierung()));
            }, 3000);   
        }

MFG
Krabbelfiechle

D
30 Beiträge seit 2013
vor 10 Jahren

Willkommen im Forum Krabbelfiechle,
sieht so aus als ob dein Timer läuft während die Form geschlossen wird. Wenn du dann probierst irgendwas mit einem Steuerelement zu machen haste deinen Fehler. Also im Form Closing den EasyTimer nullen.
Gruß
Der_Blob

W
113 Beiträge seit 2006
vor 10 Jahren

Hallo Der_Blob,

mit nullen ist das noch nicht getan, denn der Timer implementiert IDisposable -> man muss Disopose aufrufen sonst läuft der Timer munter weiter.

@Krabbelfiechle:
Du musst dir die Instanzen auf die Timer die du erstellst merken und diese dann Disposen (stoppt auch den Timer) anschließend kannst du das Fenster schließen.

mfg,
XaN

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Krabbelfiechle,

auf der von dir verlinkten Seite steht an zwei Stellen im Code zu lesen:

// Returns a stop handle which can be used for stopping  
// the timer, if required  
return timer as IDisposable;  
  

Und außerdem:

... setTimeout. The function also returns a handle. If you want clearTimeout like functionality, then the simply dispose off the handle.

Gefolgt von einem konkreten Codebeispiel dafür.

Also bitte immer erst die Dokumentation lesen, bevor man eine Frage im Forum stellt. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1.

herbivore

Thema geschlossen