Fragensteller
Hintergrundprozesse bei MessageBox unterbrechen?

Allgemeine Diskussion
-
Hallo zusammen,
folgendes Szenario:
WinForms-Anwendung. Es gibt einen "Laden"-Knopf, den der Anwender manuell betätigen kann. Und es gibt eine Checkbox "Autoload", sodass die Anwendung selbstständig Daten aktualisiert (via System.Windows.Forms.Timer).
Jetzt kann es passieren, dass beim Laden ein Fehler auftritt (z.B. Verbindung zum Backend verloren). In diesem Fall erscheint eine MessageBox "Fehler aufgetreten. Verbindung erneut herstellen oder Fehler ausgeben und Anwendung beenden?".
Das Problem: Ist die Autoload-Checkbox aktiv, poppen je nach Intervall viele bis sehr viele MessageBoxen auf.
Ich sehe im Moment folgende Möglichkeiten und möchte eure Meinung wissen:
- Checkbox deaktivieren, sobald ein Fehler auftritt (bzw. sobald MessageBox aufpoppt)
- Im Eventhandler von timer.Tick nur Daten laden, falls keine MessageBox geöffnet
- Beim zeigen einer MessageBox (alle) Threads einfrieren (falls möglich?)
Vielen Dank schonnmal!
Alle Antworten
-
...die Anwendung selbstständig Daten aktualisiert (via System.Windows.Forms.Timer).
...
Beim zeigen einer MessageBox (alle) Threads einfrieren (falls möglich?)Hallo N
was für Threads wären denn im Spiel? (startest du Threads / BackgroundWorker, oder andere asynch-Vorgänge usw?)
Beachte, ein Forms-Timer stellt keinen 'Thread' dar, sondern einen (mehr oder weniger) 'normalen' Event (ggf reentrant).
Das 'Problem' ist häufig, dass der Timer-Event auch während angezeigten DialogBoxen ausgelöst wird.
Mit etwas Logik kann man dies aber immer (einfach) lösen, bzw Timer derweil anhalten, oä.Falls wirklich (BG-) Threads laufen, sind auch hier Lösungen naheliegend (Flags, Cancelllation, IPC, kooperativ), spätestens mit der Invoke (oä)-Story sorgfältig zu implementieren.
-
Wenn das so ist laufen nicht mehrere Threads.
Bei Timer.Tick wird auf den Laden-Button geklickt. Daraufhin wird ein WCF-Service aufgerufen, der die Daten zur Anzeige liefert. Das Problem ist, wie du sagst, dass Timer.Tick auch bei aktiver MessageBox ausgelöst wird.
Es wirkt für mich aber umständlich, an allen Stellen wo eine MessageBox aufpoppen könnte, den Timer zu pausieren. Evtl. ist er von der Stelle auch garnicht sichtbar - es geht ja nicht nur um MessageBoxen, die unmittelbar mit dem Laden von Datensätzen (bzw. Fehlern) zu tun haben. Das automatische Laden im Hintergrund erscheint mir auch sinnfrei, wenn der Anwender nicht auf zB informatorische Dialoge reagiert (weil er vermutlich garnicht am PC sitzt oder was ganz anderes macht).
-
hi Norman,
du solltest den WCF-Service nicht in einem Timer.Tick abholen. Es klingt so, als ob es besser wäre das asynchron zu machen:
http://msdn.microsoft.com/en-us/library/ms734701.aspx
http://msdn.microsoft.com/en-us/library/ms730059.aspx
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
du solltest den WCF-Service nicht in einem Timer.Tick abholen. Es klingt so, als ob es besser wäre das asynchron zu machen:
Hallo Stefan,
das Stimmt. Zumal eine Abfrage länger dauern könnte als das Intervall des Timers. Ich habe das irgendwo im Backlog.
Trotzdem bleibt offen, wie die (asynchrone) Abfrage im Falle von MessageBoxen ausgesetzt wird.
-
hallo Norman,
Trotzdem bleibt offen, wie die (asynchrone) Abfrage im Falle von MessageBoxen ausgesetzt wird.
Das ist relativ einfach. Die Fehlermeldungen werden in einer zentralen Queue gesammelt, welche zu deiner Fehlerbehandlungsklasse kommt:
http://msdn.microsoft.com/en-us/library/system.collections.queue.aspx
Sobald ein Fehler in der WCF-Kommunikatiun eintritt wird das dieser Klasse signalisiert.
Die Fehlerbehandlungsklasse ist im Grunde ein Observer (Pattern) und die WCF-Abfrage das Subject:
http://www.dofactory.com/Patterns/PatternObserver.aspx
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann -
Das Problem ist, wie du sagst, dass Timer.Tick auch bei aktiver MessageBox ausgelöst wird...
Norman,
Es wirkt für mich aber umständlich, an allen Stellen wo eine MessageBox aufpoppen könnte, den Timer zu pausieren.
seitens Windows-Forms [Win32-Grundlage] gibts dazu keinen (einfachen) 'Schalter' (Timer-suspendiert wenn MessageBox).
Solange es nur um Abläufe (WCF?) im Tick-Event selber geht, kannst du dort ja mit einem einfachen Flag den reentrant-Fall erkennen (und zB Tick abbrechen).