Laden...

[gelöst] Zyan: InvalidOperationException beim Beenden einer (Server)Methode

Erstellt von Stefan.Haegele vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.891 Views
Stefan.Haegele Themenstarter:in
463 Beiträge seit 2009
vor 9 Jahren
[gelöst] Zyan: InvalidOperationException beim Beenden einer (Server)Methode

Hallo zusammen,

ich bekomme folgende Fehlermeldung:

Fehlermeldung:
System.InvalidOperationException wurde nicht behandelt.
Message="Beim Vorgang zum Rückgängigmachen wurde ein Kontext gefunden, der sich vom Kontext des entsprechenden Set-Vorgangs unterschied. Möglicherweise war der Kontext für den Thread "Set" und wurde nicht zurückgesetzt (rückgängig gemacht)."
Source="mscorlib"
StackTrace:
bei System.Threading.SynchronizationContextSwitcher.Undo()
bei System.Threading.ExecutionContextSwitcher.Undo()
bei System.Threading.ExecutionContext.runFinallyCode(Object userData, Boolean exceptionThrown)
bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteBackoutCodeHelper(Object backoutCode, Object userData, Boolean exceptionThrown)
bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Net.ContextAwareResult.Complete(IntPtr userToken)
bei System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
bei System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
bei System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
InnerException:

Ich rufe per Zyan einen List & Label Vorgang auf, welcher auch korrekt durchgeführt wird. Beim Beenden der Methode kommt der Fehler! Das lustige daran ist, man kann normal weiterarbeiten. Die Exception tritt nur beim ersten Aufruf auf!

Der Host wird folgendermaßen eingerichtet:


if ((this.srv_Host = new ZyanComponentHost(Airport.Configuration.CFG105.Items[SRVTyp.Report].Service,
                                                               Airport.Configuration.CFG105.Items[SRVTyp.Report].Port   )) != null)
                    {

                        // Host konnte geöffnet werden

                        this.srv_Host.RegisterComponent <NET::IReportservice,
                                                         NET::Reportservice > (ActivationType.Singleton);

                    } 

Der Client ruft die Methode folgendrmaßen auf


try
            {

                connection = new ZyanConnection(Airport.Configuration.CFG105.Items[SRVTyp.Report].Connection);

                IReportservice proxy = connection.CreateProxy <IReportservice>();

                if (proxy != null)
                {

                    Job job;

                    if ((job = new Job()) != null)
                    {

                        job.JobID         = report;

                        job.Target        = Airport.Configuration.CFG300.Temp  ;
                        job.Configuration = Airport.Configuration.CFG300.Config;

                        job.SQLCommand    = Airport.Configuration.CFG101.Items[sql].Command;
                        job.Connection    = Airport.Aerodrome.GetSQLConnectstring(Airport.Configuration.CFG101.Items[sql].Database);

                        job.Printer       = Airport.Configuration.CFG403[(int)prt].Drucker    ;
                        job.Designer      = Airport.Configuration.CFG403[(int)prt].Designer   ;
                        job.Kopien        = Airport.Configuration.CFG403[(int)prt].Kopien     ;
                        job.Briefpapier   = Airport.Configuration.CFG403[(int)prt].Briefpapier;

                        rc = proxy.Reporting(job);

                    }
                }
                else
                {

                    ERRLIB.ShowError(Title.Faktura, TXT.Reportingservice_Kanal, Airport.Configuration.CFG105.Items[SRVTyp.Report].Host,
                                                                                Airport.Configuration.CFG105.Items[SRVTyp.Report].Port);

                }
            }
            catch (SocketException)
            {

                ERRLIB.ShowError(Title.Faktura, TXT.Reportingservice_Invalid, Airport.Configuration.CFG105.Items[SRVTyp.Report].Host,
                                                                              Airport.Configuration.CFG105.Items[SRVTyp.Report].Port);

            }
            finally
            {

                if (connection != null)     connection.Dispose();

            } 

Hat jemand eine Idee woran es liegen könnte?

Danke
Stefan

P
1.090 Beiträge seit 2011
vor 9 Jahren

Ich denke du erzeugst dir 2 verschiedene Kontexte, die du verwendest.


if (job = new Job()) != null)

Solltest du weglassen, entweder new erzeugt dir eine Objekt oder der, der die Klasse programmiert hat richtig Mist gebaut und der Konstruktor wirft eine Exception, da hilft aber auch die Prüfung nicht.

Schreib mal deinen Code ordentlich und mach in jeder Zeile nur eine Aktion. Wenn der Fehler dann noch da ist. Mal mit den Debugger durch steppen und schauen, wo das Problem genau liegt. Und wenn es dann noch Probleme gibt. Nochmal Fragen mit der genauen Code stelle.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

3.728 Beiträge seit 2005
vor 9 Jahren

Hallo Stefan,

klingt so, als würde ein asynchroner Callback vom Zyan Server versuchen auf GUI Objekte zuzugreifen. Zugriffe auf GUI Objekte dürfen nur im GUI Thread erfolgen. Du musst im Callback auf den GUI Thread umleiten. Unter Windows.Forms ist dafür Invoke/InvokeRequired das Stichwort. In WPF gibt es auch etwas Vergleichbares, weiss es nur gerade nicht auswendig.

Gruß Rainbird

Stefan.Haegele Themenstarter:in
463 Beiträge seit 2009
vor 9 Jahren

Ich denke du erzeugst dir 2 verschiedene Kontexte, die du verwendest.

  
if (job = new Job()) != null)  
  

Solltest du weglassen, entweder new erzeugt dir eine Objekt oder der, der die Klasse programmiert hat richtig Mist gebaut und der Konstruktor wirft eine Exception, da hilft aber auch die Prüfung nicht.

Ähmm, job ist die Klasse, welche per Zyan an den Server übertragen wird. Diese muss von mir erzeugt und mit Daten gefüllt werden, oder?

Schreib mal deinen Code ordentlich und mach in jeder Zeile nur eine Aktion. Wenn der Fehler dann noch da ist. Mal mit den Debugger durch steppen und schauen, wo das Problem genau liegt. Und wenn es dann noch Probleme gibt. Nochmal Fragen mit der genauen Code stelle.

Sorry, was meinst du? Was ist dir nicht ordentlich genug? Die Exception wird geworfen nachdem die Zeile


rc = proxy.Reporting(job);

ausgeführt wurde. Die Exception wird nicht vom meinem Program geworfen sondern von der mscorlib - Mein Programm (Client & Server) laufen beide OHNE Probleme weiter.

Stefan

16.827 Beiträge seit 2008
vor 9 Jahren
if (job = new Job()) != null)

Wenn job hier immer noch null ist, dann stimmt was an der Klasse nicht.
Nach einem Ctor darf das Objekt niemals null sein, sondern es muss eine Exception geworfen werden - logisch gesehen.

Zum Rest: vertraue dem Entwickler, Rainbird.

Stefan.Haegele Themenstarter:in
463 Beiträge seit 2009
vor 9 Jahren

Das Problem ist gelöst! Nachdem das Protokoll auf TCPDuplex geändert wurde, funktioniert alles wie gewünscht und vorher unter WCF.