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
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:
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
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das Problem ist gelöst! Nachdem das Protokoll auf TCPDuplex geändert wurde, funktioniert alles wie gewünscht und vorher unter WCF.