Laden...

Programm, das auf Server zugreift, arbeitet nicht weiter

Erstellt von userid16677 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.648 Views
U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren
Programm, das auf Server zugreift, arbeitet nicht weiter

Hallo Forum!

Ich habe leider wieder einmal ein Problem: Es geht dabei um meine Anwendung aus diesem Thread: "Verunreinigte Variablen" nach COMException

Über eine API baue ich eine Verbindung zu einem Server auf, hole mir dort ein paar Daten und schreibe später ein paar Daten zurück. Manchmal kommt es dabei zu Fehlern beim Server, die ich abfange. Dazu beende ich die bisherige Verbindung, baue eine neue auf und hole die benötigten Daten erneut.

EineKlasse[] datenVomServer = Server.Elemente;

//An dieser Stelle besteht bereits eine Verbindung

for(int i = 0; i < datenVomServer.Length; i++)
{

  try
  {
     tuWasMit(datenVomServer[i]);

     //Dabei wird auf die Daten vom Server zugegriffen...
  }

  catch (System.Runtime.InteropServices.COMException)
  {
     //Das Unterbrechen der Verbindung wird abgefangen...
     Verbindung.Reconncect();
     //Dann soll beim Element, das vor dem Verbindungsabbruch bearbeitet wurde, fortgesetzt werden

     datenVomServer = Server.Elemente // <- Daten neu laden und mit bestehendem Index weiterarbeiten.
     i--; // evt. damit das letzte Element neu bearbeitet wird
  }
}

Soweit funktioniert das auch sehr gut. Allerdings bekomme ich nun das Problem, dass sich die Anwendung "aufhängt". Dies ist leider nicht deterministisch. Es kann also sein, dass die Anwendung komplett durchläuft oder es kommt zu er obigen Exception und die Daten müssen neu geladen werden. Manchmal funktioniert dies einwandfrei, manchmal hängt sich die Anwendung auch einfach auf.

Habt ihr eine Idee, wie ich das behandeln könnte? Oder wo überhaupt die Ursache dafür liegt?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Wirtschaftsinformatiker,

finde zunächst heraus, an welcher Stelle das Programm "nicht weiter arbeitet". Am einfachsten bekommst du das heraus, in dem du vor und nach jeder fraglichen Operation einen Log-Eintrag schreibst, z.B. in eine einfache Textdatei. Flush nicht vergessen.

herbivore

U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren

Ich weiß, dass dies bei Methoden auftritt, die Daten vom Server holen.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Wirtschaftsinformatiker,

etwas genauer solltest du es schon sagen. Welche Stellen? Welche Methoden? Was genau tun die? Wie erfolgt der Zugriff? Und wo genau innerhalb der Methoden hängt das Programm?

herbivore

U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren

Ok, dann werde ich mal präziser:

       

private IDictionary<String, ObjektVomServerKlasse> dictionaryMitServerdaten(Verbindung eineVerbindung, String pfadAufServer)
        {

IDictionary<String, ObjektVomServerKlasse> meinDictionary = new Dictionary<String, ObjektVomServerKlasse>();
            
            objektListe[] serverDaten = eineVerbindung.getListe(pfadAufServer);
            
          
            for (int i = 0; i < serverDaten.Length; i++)
            {
              
                try 
                {
                  String keyObjekt = serverDaten[i].getKey();
                  ObjektVomServerKlasse keyName = serverDaten[i].getName();
                }
                catch (System.Runtime.InteropServices.COMException ex) 
                {
                    throw ex;
                }

              meinDictionary.Add(keyObjekt , keyName );

       
        }
 return meinDictionary;
}


Problematisch sind die beiden getMethoden. Die Schleife wird etwa 1000 mal durchlaufen.

Die Exception wird an die übergeordnete Methode weitergeleitet. Diese trennt die Verbindung, baut eine neue auf und führt die Methode ernaut aus mit dem neuen Verbindungs-Objekt.

 
          try
                {
    dictionary = dictionaryMitServerdaten(eineVerbindung, pfadAufServer);
                }             
  catch (System.Runtime.InteropServices.COMException)
                {
                    i--;
                    eineVerbindung.Disconnect();
                    eienVerbindung =createVerbindung(loginDaten);
                    continue;
                }

731 Beiträge seit 2006
vor 13 Jahren

Und irgendwann gibt es eine COMException und es wird wieder versucht eine Verbindung aufzubauen... Es gibt dann wieder eine COMException und es wird wieder versucht eine Verbindung aufzubauen.... Es gibt dann wieder.......

So könnte ich es mir vorstellen...

MfG
wax

U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren

Und was kann man da tun? Wenn ich die Exception nicht abfange, ist der User gezwungen, den Vorgang abzubrechen und die Anwendung neu zu starten.

5.742 Beiträge seit 2007
vor 13 Jahren

Und was kann man da tun? Wenn ich die Exception nicht abfange, ist der User gezwungen, den Vorgang abzubrechen und die Anwendung neu zu starten.

Du könntest dem Benutzer nach z.B. 10 aufgetretenen Exceptions anbieten, den Vorgang abzubrechen. In einem solchen Fall wäre es wahrscheinlich, dass evtl. was anderes schiefgelaufen ist.

Aber logge sicherheitshalber mal ein bisschen (am besten auch in den Catch-Handlern) - dann solltest du schnell sehen, wo's hakt.

U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren

Ja, ich werde das loggen.

Das mit der Endlosschleife klingt plausibel. Leider ist dieses Programm so gedacht, dass es ohne User-Interaktion nachts auf einem Server arbeiten soll, deshalb ist das Abbrechen nach einer bestimmten Zahl von Versuchen keine wirklich schöne Lösung.

2.298 Beiträge seit 2010
vor 13 Jahren

Es ist aber auch nicht hilfreich wenn das Programm sich ins Endlose verläuft. - Dann lieber lasse das Programm nach x-Versuchen beenden und lasse eine Meldung aufpoppen dass etwas schief lief.

So sieht der Admin / Entwickler / Nutzer dass etwas schief lief und kann sich der Sache annehmen. Das Logging solltest du aber dennoch einbauen, so dass sich der Fehler auch schnell finden lässt.

Es ist dir nicht geholfen wenn der Fehler einfach 'as is' genommen wird und dennoch dauerhaft ignoriert wird.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |