[gelöst] DotNet Variable wird zu früh disposed

25. April 2019 11:14

Hallo,

ich nutze für sftp die winscp dotnet dll und möchte dort die Events, die bereitgestellt werden, nutzen. Nun muss ich ja dafür die Variable auf global stellen, um das WithEvents Property zu setzen. Das führt jedoch dazu, dass mein Client nach durchlaufen des Codes (ohne Code in den Events) abstürzt und laut Log ist der Fehler darin, dass das Objekt disposed wurde:

Type: System.InvalidOperationException
Message: Object is disposed
StackTrace:
bei WinSCP.Session.CheckNotDisposed()
bei WinSCP.Session.CheckNotOpened()
bei WinSCP.Session.remove_FileTransferProgress(FileTransferProgressEventHandler value)
Source: WinSCPnet

Wenn ich die Events deaktiviere funktioniert es ohne Absturz - die "SupressDispose" Property gibt es nur für lokale Variablen, das ist natürlich praktisch, dass die Optionen sich gegenseitig ausschließen. Hatte jemand schon mal so ein Problem oder hat eine Idee, wie ich das Problem umgehen kann?
Zuletzt geändert von bennosh am 26. April 2019 10:57, insgesamt 1-mal geändert.

Re: DotNet Variable wird zu früh disposed

25. April 2019 13:20

könntest du uns ggf. einen Teil deines Quellcodes - von mir aus auch Pseudocode zur Verfügung stellen?
So wie ich das verstehe, läuft dein kompletter Code durch - mit Erfolg? -> wenn mit Erfolg, liegt die Problematik "nur" im Crash des Clients, oder?

Re: DotNet Variable wird zu früh disposed

26. April 2019 10:56

Moin, ich konnte das Problem nun selbst umgehen. Offensichtlich versucht sich das DotNet Objekt nach Benutzung selbst zu disposen, allerdings wurde es schon vorher vom GarbageCollector disposed. In C# wird das Problem mit einem using umgegangen, das wir ja leider bei NAV nicht haben.

Das Problem konnte ich nun damit "lösen", dass ich erst eine lokale Variable des gleichen Typs mit dem Property SuppressDispose gesetzt initialisiere und diesen Wert dann der globalen DotNet Variable mit den Events zuweise. Auf diesem Wege umgehe ich den Dispose und kann am Ende selbst ein CLEAR auslösen - funktioniert wie ein Dispose hier. Ein Dispose am Ende des Codes selbst auszuführen funktioniert allerdings nicht und führt zu bekanntem Fehler.

Ich habe mal von nem Kollegen gehört, dass es bei DotNet Objekten auch teilweise darauf ankommt, in welcher Reihenfolge diese beim Anlegen gesetzt werden also bei den Globals/Locals. Bei mir hat das aber leider keinen Effekt gehabt.

Danke trotzdem :)

sweikelt hat geschrieben:wenn mit Erfolg, liegt die Problematik "nur" im Crash des Clients, oder?


Exakt, sobald das DotNet Objekt "fertig" ist, crashte der Client - MESSAGEs würden allerdings z.B. nicht mehr angezeigt werden, der Client schließt sich einfach und im Server Log wird obiger Fehler angezeigt, der Client gibt keinen Fehler zurück.

Re: [gelöst] DotNet Variable wird zu früh disposed

26. April 2019 13:46

Nochmal als Anmerkung.. Also die Events sind echt total schlecht gelöst, vermutlich werde ich doch den Umweg machen und diese weglassen, da einfach der Client bei jedem Fehler abstürzt.. Habe es mal mit einem Try über die Funktion versucht, aber das bringt exakt nichts. Man kann einfach die Fehler nicht abfangen.