Kann Timer Anwendung ausbremsen?
-
Und zwar habe ich die Anwendung welche ich auf Arbeit tipper (die mit dem Webservice) ein wenig erweitert. - Zusätzlich zu dem Timer der die Abfragen ausführt, existiert nun auch ein Timer welcher jede Sekunde prüft ob der Webservice verfügbar ist.
Sollte der WS nicht erreichbar sein, schalte ich den anderen Timer ab & wenn er wieder verfügbar ist umgekehrt.
Mein Problem zeigt sich nun aber darin, dass wenn der WS nicht da ist die Messagebox ausgegeben wird, dass er nicht verfügbar ist & ansonsten alles etwas langsamer reagiert.
Ist der WS verfügbar, läuft alles wie gewohnt in annehmbarer Geschwindigkeit.Mein Code sieht wie folgt aus, sollte es daran liegen:
/// <summary> /// Timerfunction to check if the webservice is online /// </summary> private void tmrCheckOnline_Tick(object sender, EventArgs e) { ReasonSelector rsSelector = new ReasonSelector(); String error; if (!rsSelector.checkonline(out error)) { // if webservice was online or Application just started if (this.online) { this.online = false; MessageBox.Show(error); } // stop refresh Timer this.tmrRefreshLineStates.Enabled = false; this.stateBar.GetCommPanel(0).Text = "WS Offline"; this.stateBar.SetCommPanelConnected(0, false); } else { // if webservice was is just started first time this run // or Application just started then there are no reasons and // locations of DownTimes - so get them if (this.lstdtLocations.Count == 0 && this.lstdtReasons.Count == 0) { this.getReasonsAndLocations(); this.VisualizeDownTimeInformation(); this.VisualizeStates(); } if (this.tmrRefreshLineStates.Enabled == false) { // if webservice is available start refreshtimer this.tmrRefreshLineStates.Enabled = true; this.stateBar.SetCommPanelConnected(0, true); this.stateBar.GetCommPanel(0).Text = "WS Online"; this.online = true; } } }
Nun stell ich mir natürlich die Frage, warum die Anwendung im Falle der Webservice ist offline verlangsamt.
Ich vermute, dass es eventuell am Verbindungsversuch liegt aber sollte der innerhalb des Timers nicht eigentlich in einem "eigenen" Thread laufen?
-
inflames2k schrieb:
Ich vermute, dass es eventuell am Verbindungsversuch liegt aber sollte der innerhalb des Timers nicht eigentlich in einem "eigenen" Thread laufen?
nein
-
Ok, also bremst wirklich der Verbindungsversuch die Anwendung aus. - Mal sehen, eventuell find ich eine Lösung.
-
mogel schrieb:
inflames2k schrieb:
Ich vermute, dass es eventuell am Verbindungsversuch liegt aber sollte der innerhalb des Timers nicht eigentlich in einem "eigenen" Thread laufen?
nein
Wieso nein? Das kommt darauf an welche Timer-Klasse er verwendet. Es gibt sehrwohl Timer die ihre "Tick" Callbacks in einem "eigenen" Thread machen.
-
Stimmt hab ich vorhin garnicht dran gedacht. - Die Aus dem Namespace System.Threading.
-
Die sollte die Callbacks dann aus einem "eigenen" Thread heraus aufrufen.
Wobei der "eigene" Thread evtl. auch ein Thread aus dem Thread-Pool sein könnte - das kann ich so nicht sagen. Müsste ich selbst nachlesen.
-
Irgendwie komm ich gerade nicht mit der Nutzung des Timers aus dem Namespace Threading zurecht.
An sich würde ich mit dem Timer nur eine boolsche Variable auf true bzw. false setzen, kann man diese denn so einfach übergeben?
// Hab mir gerade was anderes überlegt, ein Backgroundworker arbeitet in einem eigenen Thread *denk* daher werd ich wohl diesen im Timer aufrufen.
-
Inwiefern kommst du nicht zurecht?
-
Naja hab noch nicht wirklich mit Threads gearbeitet. - Was ich mir nun aber außerhalb der Arbeitszeiten anschaun werd.
Ich hatte mir jetzt wie gesagt überlegt, dass mit einem Backgroundworker zu machen, welchen ich mit dem Timer aufrufe.
Allerdings, passiert rein garnix.
Meine Idee war es den Backgroundworker einzig die Onlineabfrage machen zu lassen. - Doch wie ich sehe, kann ich darin den Wert einer boolschen Variable nicht ändern.
Meine Idee war nun eigentlich folgendes:
private void bgWorkerCheckOnline_DoWork(object sender, DoWorkEventArgs e) { ReasonSelector rsSelector = new ReasonSelector(); String error; if (!rsSelector.checkonline(out error)) { this.online = false; } else { this.online = true; } }
Dies wollte ich dann in der Timerfunktion aufrufen und die Weitere verarbeitung (Aufruf der evtl. refresh-Methoden falls online).
Was mache ich falsch, bzw. wie kann ich das lösen?
// Interessant, wenn ich im nachhinein also nach folgender Zeile eine MessageBox öffne macht er dann doch was er soll. - Wie bekomme ich es nun hin, dass dies auch ohne MessageBox funktioniert?
this.bgWorkerCheckOnline.RunWorkerAsync(); MessageBox.Show(this.online.ToString()); // weitere Verarbeitung je nach Onlinestatus
// Gut eins funktioniert dennoch nicht. Er ruft die Timerfunktion scheinbar nur einmal auf.
// Ich idiot. Es läuft nun, wie ich es gewünscht hab.
Hatte versehentlich das Timerevent nicht gebunden. - Somit konnt ja nix passieren.Hab im Timerevent folgendes hinzugefügt und es läuft:
this.tmrCheckOnline.Stop(); while (this.bgWorkerCheckOnline.IsBusy) { Application.DoEvents(); System.Threading.Thread.Sleep(200); } this.tmrCheckOnline.Start();