Frage

Nehmen Sie eine .Net Winforms-App.Mischen Sie eine schwache drahtlose Netzwerkverbindung ein, mischen Sie sich mit ein paar Benutzern, die gerne gelegentlich den blauen Stecker herausziehen, und fügen Sie zur Sicherheit einen Systemadministrator hinzu, der beschließt, die SQL-Server-Box ab und zu ohne Vorwarnung neu zu starten, nur um alle am Laufen zu halten ihre Zehen.

Welche Vorschläge und Strategien gibt es für den Umgang mit einem solchen Szenario in Bezug auf:

  • Fehlerbehandlung - Wickeln Sie beispielsweise jeden Aufruf auf den Server mit einem Versuch/Fang oder verlassen Sie sich auf irgendeine Form der generischen Fehlerbehandlung, um dies zu verwalten?Wenn ja, wie sieht es aus?

  • Anwendungsverwaltung - Deaktivieren Sie beispielsweise die App und erlauben Sie den Benutzern nicht, mit ihr zu interagieren, bis eine Verbindung erneut erkannt wird?Was würden Sie tun?

War es hilfreich?

Lösung

Die Antwort hängt von der Art Ihrer Bewerbung ab.Es gibt Anwendungen, die offline funktionieren können – zum Beispiel Microsoft Outlook.Solche Anwendungen behandeln Verbindungsausnahmen nicht als kritisch, sie können Ihre Arbeit lokal speichern und später synchronisieren.Andere Anwendungen wie Online-Spiele behandeln Kommunikationsprobleme als kritische Ausnahme und werden beendet, wenn die Verbindung unterbrochen wird.

Was die Fehlerbehandlung betrifft, denke ich, dass Sie Ausnahmen auf allen Ebenen kontrollieren sollten, anstatt sich auf einen allgemeinen Code für die Ausnahmebehandlung zu verlassen.Ihre Geschäftsschicht sollte verstehen, was auf der unteren Schicht (in unserem Fall die Datenzugriffsschicht) passiert ist, und entsprechend reagieren.Ein Verbindungsverlust sollte nicht als solcher behandelt werden unerwartete Ausnahme Meiner Meinung nach.Für bewährte Methoden des Ausnahmemanagements empfehle ich einen Blick auf Anwendungsblock zur Ausnahmebehandlung.

In Bezug auf das Anwendungsverhalten sollten Sie sich auf die folgende Frage beantworten: "Hat meine Bewerbung einen geschäftlichen Wert für den Kunden im getrennten Zustand?" In vielen Fällen wäre es für den Endbenutzer von Vorteil, ihre Arbeit im getrennten Zustand fortzusetzen.Allerdings ist ein solches Verhalten enorm schwer umzusetzen.

Speziell für Ihr Szenario hat Microsoft entwickelt Getrennter Service-Agent-Anwendungsblock

Andere Tipps

Ich habe WinForms und .NET schon seit Jahren nicht mehr berührt, daher kann ich Ihnen keine technischen Details nennen, aber es gibt die größere Bildantwort:

Zuallererst: Binden Sie Ihre Formulardaten nicht direkt an eine Datenbank.

Erstellen Sie eine separate Daten-/Modellebene, an die Sie Ihre Formular-Widgets binden.

Von da an stehen Ihnen je nach dem Grad an Stabilität und Verfügbarkeit, den Sie bereitstellen müssen, mehrere Optionen zur Verfügung.

Eine der einfachsten Lösungen wäre hier wahrscheinlich, nur die Teile der Anwendung zu aktivieren/deaktivieren, die basierend auf dem Verbindungsstatus mit einer Datenbank interagieren müssen.

Die nächste Schutzstufe würde darin bestehen, den Teil des Datenmodells lokal zwischenzuspeichern und bei unterbrochener Datenbankverbindung den lokalen Cache zum Anzeigen und Deaktivieren aller Funktionen zu verwenden, die eine explizite Datenbankverbindung erfordern.

Die wahrscheinlich schwierigste Sache (die dem Endbenutzer möglicherweise auch die stabilste Erfahrung bietet) besteht darin, die Datenbank lokal zu replizieren und eine Art Synchronisierungsschema zu verwenden, um Ihre Kopie der Datenbank mit der Remote-Datenbank synchron zu halten.

Das kann ein wenig sein zu viel Unterstützung für das Offline-Szenario, aber haben Sie darüber nachgedacht?Microsoft Sync Framework„?Im Framework enthalten sind die „Sync Services für ADO.NET 2.0“, die es Ihrer Anwendung ermöglichen, eine lokale SQL Server CE-Instanz zu erreichen.Dies kann über verschiedene Methoden problemlos mit einem zentralen SQL Server synchronisiert werden.

Dieses Framework behandelt das permanente Offline-Szenario und ist, wie gesagt, möglicherweise nicht für Ihre spezifischen Anforderungen geeignet, bietet Ihrer Anwendung jedoch eine solide Offline-Unterstützung.

Wir haben das in unserem Main() Methode, die alle nicht behandelten Ausnahmen abfängt ...

Application.ThreadException += new 
System.Threading.ThreadExceptionEventHandler(UnhandledExceptionCatcher);

Thread.GetDomain().UnhandledException += new 
UnhandledExceptionEventHandler(Application_UnhandledException);

und dann Application_UnhandledException Und UnhandledExceptionCatcher Benutzerfreundliche Nachrichten anzeigen.

Darüber hinaus sendet die Anwendung dann Daten wie den Stack-Trace per E-Mail an die Entwickler, was sehr nützlich sein kann.

Es hängt natürlich von der App ab, aber bei den von Ihnen beschriebenen Fehlern würde ich die App schließen.

In unserer Anwendung geben wir dem Benutzer die Möglichkeit, eine Verbindung zu einem anderen Server herzustellen. Wenn beispielsweise die Datenbankverbindung fehlschlägt, wird ein Dialogfeld angezeigt, das besagt, dass der Server nicht verfügbar ist, und er kann eine andere IP-Adresse eingeben, um es zu versuchen.

Verwenden Sie so etwas wie SQLite um Daten offline zu speichern, bis eine Verbindung verfügbar ist.

Aktualisieren:Ich glaube, SQLite ist das Back-End dafür Google Gears, was meines Wissens nach das tut, was Sie in Web-Apps suchen ...Allerdings weiß ich nicht, ob es in einem Nicht-Web-Kontext verwendet werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top