[Gelöst] C/FRONT.net 4.03 - AccessViolationException

10. März 2009 20:06

Hallo.

Ich habe erneut ein Problem mit C/FRONT. Erstmal allgemeine Informationen zur Umgebung:

Datenbank: 4.0 SP2
C/FRONT Version: 4.0.3.23305
IDE: Visual Studio 2008
Sprache: C#

Das Hauptziel meiner Anwendung ist die Auswertung von Daten aus der Navision DB. Um mehrere gleichzeitige Anfragen zu gestatten, lasse ich die Abfragemethode per Threading aufrufen. Sofern ich eine Anfrage starte, funktioniert alles einwandfrei. Spätestens sowie ich eine zweite Anfrage zuschalte, gibt mir VS eine AccessViolationException aus. Die zwei Anfragen müssen gleichzeitig erfolgen, Anfrage 1 darf also noch nicht fertig sein.

Lasse ich die beiden Anfragen nacheinander ablaufen, funktioniert auch hier alles einwandfrei.

Keine der Methoden ist als static o.ä. deklariert, dennoch habe ich sogar überprüft ob die sich evtl. die Handle-Variablen für die Tabellen bzw. Records im Arbeitsspeicher überschneiden. Jede Handle-Variable hat jedoch seinen eigenen Arbeitspeicherbereich.

Es handelt sich bei beiden Anfragen um exakt dieselbe Anfrage, sodass gleiche Daten ausgegeben werden müssten.

Visual Studio hat geschrieben:System.AccessViolationException wurde nicht behandelt.
Message="Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist."
Source="Microsoft.Navision.CFront.CFrontDotNet"
StackTrace:
bei Microsoft.Navision.CFront.NativeMethods.NextRecNative(Int32 tableHandle, Int32 recordHandle, Int16 step)
bei Microsoft.Navision.CFront.CFrontDotNet.NextRecord(Int32 tableHandle, Int32 recordHandle, Int16 step)
bei CFrontNetTest.Management.Start(RequestObject pRequestObj)
bei CFrontNetTest.Management.ExecRequest(IAsyncResult pAr)
bei System.Net.LazyAsyncResult.Complete(IntPtr userToken)
bei System.Net.ContextAwareResult.CompleteCallback(Object state)
bei System.Threading.ExecutionContext.runTryCode(Object userData)
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:


Hat diesbezüglich jemand Erfahrungen gemacht oder evtl. eine Ahnung woran es liegen könnte? Bin für alle Hinweise und Anmerkungen offen.

Gruß,
dmax
Zuletzt geändert von dmax am 11. März 2009 10:32, insgesamt 1-mal geändert.

Re: C/FRONT.net 4.03 - AccessViolationException

10. März 2009 21:20

Hallo dmax,

C/Front ist nicht reentrant. Wenn die .net-Library nicht dafür sorgt (ich selbst benutze ein Delphi-Unit die dafür sorgt), musst du selbst mit Semaphoren dafür sorgen, das nur ein Thread zur Zeit auf C/FRONT zugreift.

Gruß, Fiddi

Re: C/FRONT.net 4.03 - AccessViolationException

11. März 2009 10:30

Hallo Fiddi,

vielen Dank für die Antwort.

Jetzt hab ich endlich wieder einen Punkt an dem ich ansetzen kann!

Gruß,
dmax