Dialog beim Öffnen der Sammlung anzeigen

Aufgabeninfo

Projekt: 

Typ: 

Feature-Wunsch

Zielversion: 

Status: 

Geschlossen

Lösung: 

Erledigt

Erledigt in Version: 

Beim Öffnen der Sammlung muss ein Dialog angezeigt werden der einem darüber Informiert, dass gerade eine Sammlung geöffnet wird. Wichtig ist das, wenn das NAS gerade die Platte anfährt oder wenn es aus ist. Mit dem Dialog muss es auch Möglich sein die laufende Aktion unterbrechen zu können. Sollte das NAS aus sein damit man nicht Wochen lang warten muss. Ebenso sollte später das Reorganisieren/Optimieren und das Datenbank Upgrade über diesen Dialog laufen. Muss berücksichtigt werden. Die Operationen müssen dann natürlich alle in einem Thread ausgeführt werden.

Kommentare

ungefähre Klassenstruktur

Die Klassen sollte in etwa folgende Struktur besitzen:

class ASyncWorkerDialog
  private _thread
  private _synchronisationContext
  private _dialog
  private _canceled
 
  public event WorkFinished
 
  public DoWork(new delegatetype work(ASyncWorkerDialog, data))
    Dialog erstellen, ButtonEvent setzen und anzeigen
    Thread erstellen, Event setzen und Work innerhalb von dem Thread aufrufen
    Am Ende des Threads oder automatisiert das Event WorkFinished aufrufen
 
  public DoButtonClicked()
    Die Variable _canceled setzen
    Sollte der Thread nach 400ms noch laufen so muss er abgeschossen werden.
 
  public SetCancel(bool)
    Wenn false, dann muss der Abbrechenbutton deaktiviert werden. Ansonsten aktiviert.
 
  public DoSyncProgress(new delegatetype())
    Delegate in einem synchronisierten Zustand aufrufen
 
  public ProgressMessage(string Text)
    Der Text muss mit DoSyncProgress synchron auf das Fenster übertragen wurden 

Als Code könnte das in etwa dann wie folgt aussehen. Eventuell macht es aufgrund der Größe der Methode auch Sinn diese bewusst nicht als eine anonyme Methode zu konzipieren. Sondern als normale Methode. In dieser Methoden muss später auch die Entscheidung stattfinden ob eine Offline Datenbank geöffnet wird oder ob ein DB Upgrade stattfindet. Was natürlich auch in dieser Methode abgearbeitet werden muss. Das darf, dann aber nicht abgebrochen werden dürfen.

ASyncWorkerDialog aw = new ASyncWorkerDialog();
aw.WorkFinished += new Event(); // Aktualisiert den Status der Komponenten
aw.DoWork(new delegate(ASyncWorkerDialog worker)
  {
    worker.ProgressMessage("Sammlung \"" + Name + "\" wird geöffnet...");
    if (!File.Exists)
    {
      MessageResult mr = none;
      worker.DoSyncProgress(new delegate()
      {
        mr = MessageBox("Nicht gefunden. Neu erzeugen?");
      }, null);
 
      if (mr = ok)
        // mach irgendwas was
    }
  }, null);

Beim Öffnen einer Datenbank

Aufgabeninfo

Status: 

Geschlossen

Lösung: 

Erledigt

Erledigt in Version: 

Beim Öffnen einer Datenbank erscheint jetzt immer ein modaler Dialog. Die Schaltfläche "Abbrechen" setzt zu erst ein Flag auf welches der Thread reagieren kann. Wenn er es nicht innerhalb von 1,5 Sekunden (Timer Event) getan hat wird er abgeschossen.

Fehlermeldungen aus Thread

Aufgabeninfo

Status: 

Zugewiesen

Sollte wärend der Verarbeitung im Thread ein Problem auftretten (z.B.: Datenbankupgrade) so würde normal ein Dialog angezeigt. In diesem Fall hängt sich die Anwendung allerdings komplett auf. Das ist nicht sonderlich schön. Hier muss eine Lösung für gefunden. Genau so verhält es sich auch (oder vielleicht auch nur hier), wenn wärend dem Zeichnen in der ListView ein Fehler auftritt. Zu mindestens hängst sich die Anwendung dann auf, wenn eine MessageBox anzuzeigen versucht wird.

Vielleicht wäre es das Sinnvollste wenn das Logging-Modul alle Fehlermeldungen zusätzlich in einer seperaten Fehler XML Datei protokoliert und in der Statusleiste ein Symbol angezeigt wird (via Event). Bei einem Klick auf dieses Symbol wird die XML Datei geöffnet, was in der Regel mit dem aktuellen Browser geschehen sollte. Das Symbol sollte auch dezent blinken (oder pulsieren Alpha 30-100%) um zu verdeutlichen, dass dort etwas passiert ist.

Sollten Fehler auftreten wird

Aufgabeninfo

Status: 

Erledigt

Erledigt in Version: 

Sollten Fehler auftreten wird in jedem Fall ein ErrorLog.xml ( #115 - Logdatei muss nach AppData (Geschlossen) ) erstellt und der Benutzer darüber durch ein Icon in der Statusleiste darüber informiert. Klickt er darauf, dann wird die Anwendung gestartet mit der .xml verknüpft ist und der Status in der Statusleiste zurückgesetzt. Die Logdatei wird nicht zurückgesetzt.

Bei entsprechender Fehleranzahl kann diese Datei durchaus den Rest der Anwendung ausbremsen. Also an den Stellen an denen Fehler auftreten.

Statusänderung

Aufgabeninfo

Status: 

Geschlossen

Die Aufgabe wurde aufgrund von Inaktivität automatisch geschlossen.