Hallo zusammen
In der CSharp Software werden Daten über einen Stream angefordert (gSOAP). Um mit gSOAP zu kommunizieren, haben wir eine C++ DLL dazwischen.
Aus der CSharp Software wird dann festgelet, was für Daten angefrodert werden. Man kann auch die Buffergrösse des Streams varrieren.
Ist die Anfrage mal abgesetzt worden, übernimmt die C++ DLL die Arbeit, um die Daten via SOAP anzufrodern. Dabei werden dann immer etwa Packete
von 64k von der C++ DLL via CALLBACK Funktion an die CSharp Applikation zurückgeliefert. Dabei muss dann in der CALLBACK Funktion die Daten vom
unmanaged Heap in den Managed Heap kopiert werden, um danach diese in ein FIFO zu speichern, welche dann weiter verarbeitet werden.
Nun das Problem: In der Callback Funktion werden die Daten in eine Queue (FIFO) geschrieben, und in einem anderen Thread dann wieder verarbeitet.
Nur teilweise passiert es, dass Daten, welche in der Callbackfunktion anstehen bis zu 3 sekunden benötigen um in die Queue zu gelangen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public static void DispatchRawDataStream(IntPtr DataPtr, int DataLength) { watch.Start(); Int32[] data = new Int32[DataLength]; Marshal.Copy(DataPtr, data, 0, DataLength);
lock (StreamQueueObj.lockObj) { StreamQueueObj.DataChunk.Enqueue(data); }
watch.Stop(); Console.WriteLine("DataLength: " + DataLength + " --> " + watch.ElapsedMilliseconds); watch.Reset(); } |
Also dort wo in der Console die ellapsed Zeit des Timers ausgegeben wird, dort kann es vorkommen dass wir zwischen 2-3 Sekunden warten müssen. Jetzt stellt sich
die Frage warum das so lange dauert? Beansprucht ein anderer Thread so lange Zeit ? Oder benötigt das kopieren aus dem unmanaged Heap teilweise so lange? Wenn ich die Zeiten betrachte dann, habe ich meistens 0 ms verzögerung, was auch anzunehmen ist... aber eben teilweise wartet die FUnktion 2-3 Sekunden.. Stellt sich vielleicht die Frage, auf welchem Thread der Callback ausgeführt wird? Kann ich dafür auch nen separaten Thread beanspruchen um solche Zeitkritischen Dinge zu entschärfen? Wenn ja wie ? Muss ich da von C++ DLL aus einen asynchronen methodenaufruf des Callbacks bewerkstelligen?
Mit freundlichen Grüssen