Laden...

"Verunreinigte Variablen" nach COMException

Erstellt von userid16677 vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.461 Views
U
userid16677 Themenstarter:in
63 Beiträge seit 2009
vor 13 Jahren
"Verunreinigte Variablen" nach COMException

Hallo,

mein Problem ist das Folgende: Ich habe eine Verbindung zu einem Server und rufe von dort Daten ab. Der Vorgang kann mehrere Stunden dauern, sodass es passiert, dass die Verbindung abbricht.
Der Abruch der Verbindung verursacht eine COMException, die ich mittels try-catch abfange. Daraufhin führe ich ein Reconnect zum Server durch und lasse den Vorgang bei der abgebrochnen Stelle weiterlaufen.
Jetzt sind allerdings alle Variablen und Referenzen, die mit Daten, die zuvor vom Server geholt worden, verunreinigt. Damit meine, dass nicht mehr das eigentliche Datum, das vor der Exception darin befindlich war, vorhanden ist, sondern in allen Variablen die Meldung der Exception - also sowas wie "Excepion blabla.. keine Verbindung zum Server.. blabla".
Damit kann ich natürlich den Vorgang nicht fortsetzen und das Ganze führt zu weiteren Exceptions.

Vielen Dank für eure Mühe!

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Wirtschaftsinformatiker,

Ich habe eine Verbindung zu einem Server und rufe von dort Daten ab. Der Vorgang kann mehrere Stunden dauern, sodass es passiert, dass die Verbindung abbricht.

Kannst du Einfluss auf den Server nehmen?
Deutlich sinnvoller wäre hier IMHO der Ansatz, dass du dem Server lediglich mitteilst, dass er etwas tun soll und dann während der Wartezeit die Verbindung beendest.

Dann kannst du entweder durch Polling alle x Minuten beim Server anfragen, ob das Ergebnis verfügbar ist, oder du richtest ein Callbackmechanismus ein, sodass dich der Server benachrichtigen kann, wenn er die Aufgabe beendet hat.

Eine Verbindung über das Internet mehere Stunden ununterbrochen offen halten zu wollen, ist eher suboptimal.

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

Kannst du Einfluss auf den Server nehmen?

Leider nicht.

Deutlich sinnvoller wäre hier IMHO der Ansatz, dass du dem Server lediglich mitteilst, dass er etwas tun soll und dann während der Wartezeit die Verbindung beendest.

Das ist leider nicht möglich, da es sich um eine Schleife handelt, wo eine Anfrage vom Client an den Server geht und die Antwort direkt zurückkommt - also eine Vielzahl kleiner aufeinander folgender Vorgänge.

Dann kannst du entweder durch Polling alle x Minuten beim Server anfragen, ob das Ergebnis verfügbar ist, oder du richtest ein Callbackmechanismus ein, sodass dich der Server benachrichtigen kann, wenn er die Aufgabe beendet hat.

Die API, die ich verwenden muss, lässt eine solche Funktionalität nicht zu. Ich kann nicht mal den Verbindungsstatus abfragen. Das einzige was ich kann, ist einmal mit dem Server verbinden und später wieder disconnecten.

Eine Verbindung über das Internet mehere Stunden ununterbrochen offen halten zu wollen, ist eher suboptimal.

Sehe ich auch so. Ich habe leider keine Wahl. Der Vorgang lässt sich nicht beschleunigen und dauert bis zu 8 Std.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Wirtschaftsinformatiker,

Jetzt sind allerdings alle Variablen und Referenzen, die mit Daten, die zuvor vom Server geholt worden, verunreinigt. Damit meine, dass nicht mehr das eigentliche Datum, das vor der Exception darin befindlich war, vorhanden ist, sondern in allen Variablen die Meldung der Exception - also sowas wie "Excepion blabla.. keine Verbindung zum Server.. blabla".

was für Variablen? Wo deklariert? Wie und wo werden die gefüllt?

herbivore

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

Ok, ich versuche das mal zu skizzieren.




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
     }
  }



Nach dem die Exception abefangen wurde, sind alle alle Elemente des Arrays mit der Message der Exception gefüllt.

datenVomServer[0]="Keine Verbindung zum Server...";
datenVomServer[1]="Keine Verbindung zum Server...";
datenVomServer[2]="Keine Verbindung zum Server...";
datenVomServer[...]="Keine Verbindung zum Server...";

So kann ich mit TuWas im try Block nichts mehr anfangen.

1.815 Beiträge seit 2005
vor 13 Jahren

Hallo!

Das kommt, weil es sich um Properties handelt, welche vermutlich ihre Werte über die COM-Verbindung direkt laden.
Wenn die Verbindung nun gestört ist, wird bei Abfrage aller Werte die COM-Exception zurückgegeben.

Nobody is perfect. I'm sad, i'm not nobody 🙁

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

Die Verbindug wird ja wieder aufgebaut und trotzdem bleibt der Inhalt derselbe.

1.378 Beiträge seit 2006
vor 13 Jahren

Kannst du nicht nur ein paar Elemente nach einander laden, bearbeiten und dann die nächsten Anfordern? Dann wär eine Unterbrechung nur so schlimm als das das letzte Packet neu geladen und bearbeitet werden muss anstatt alles neu zu laden.

Lg XXX

1.378 Beiträge seit 2006
vor 13 Jahren

Die Verbindug wird ja wieder aufgebaut und trotzdem bleibt der Inhalt derselbe.

Es ist aber eine andere Verbindung. Die COM Objekte wissen das ja nicht.

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

Am grundlegenden Aufbauch der Anwendung kann ich leider nichts ändern. Mir ist das so vorgelegt worden und muss jetzt sehen, wie man diese Exception behandeln kann.

Das mit der Referenz leuchtet natürlich ein, aber was man macht man da?

1.378 Beiträge seit 2006
vor 13 Jahren

Ich könnte mir vorstellen, dass du bei einem Abbruch alle zu bearbeitenden Objekte neu ladest aber nur von dem an weiterarbeitest wo der Abbruch stattgefunden hat.



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
  }
}

Lg XXX

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

Ja, das wäre zu schön gewesen, aber leider führt auch das zu:

"datenVomServer = Server.Elemente

hat eine Ausnahme vom Typ "System.Runtime.InteropServices.COMException" verursacht."

Gelöschter Account
vor 13 Jahren

datenVomServer[0]="Keine Verbindung zum Server...";

Sind da COMProxies drin?
Vielleicht ahnst du schon worauf ich hinaus will....

Gelöschter Account
vor 13 Jahren

Da sind definitv Proxys im Spiel. Wenn du die Daten Lokal halten willst, dann kopiere sie in eine eigene Struktur um.

Was genau hast du dann mit den Daten vor? Reine Auswertung oder brauchst du sie für weitere Interaktion mit der Schnittstelle?

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

Ich brauche sie für weitere Interaktionen.

1.378 Beiträge seit 2006
vor 13 Jahren

Ja, das wäre zu schön gewesen, aber leider führt auch das zu:

"datenVomServer = Server.Elemente

hat eine Ausnahme vom Typ "System.Runtime.InteropServices.COMException" verursacht."

Naja das war auch nur ein optimistisches Beispiel. Das du deine Serverinstanz evt. auch erst neu erstellen und holen musst weil diese wahrscheinlich auch auf der alten Verbindung basiert hab ich jetzt nicht mitbedacht.

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

Selbst wenn ich eine ganze neue Connection instanziere, passiert das.

Ich glaube fast, das hängt eher mit dem Server zusammen als mit dem Code...