Ich bin jetzt von diesem Problem den ganzen Tag blockiert, lesen Sie Tausende von Google-Ergebnissen, aber nichts scheint mein Problem zu reflektieren oder sogar in die Nähe kommen ... ich hoffe, einer von Du hast einen Stoß in die richtige Richtung für mich.StackOverFlowException - aber oviously KEINE Rekursion/Endlosschleife
Ich schrieb eine Client-Server-Anwendung (also mehr wie 2 Anwendungen) - der Client sammelt Daten über sein System, sowie einen Screenshot, serialisiert all dies in einen XML-Stream (das Bild als ein Byte [] - Array]) und sendet dies in regelmäßigen Abständen an den Server. Der Server empfängt den Stream (via TCP), deserialisiert das XML in ein Informationsobjekt und zeigt die Informationen in einem Windows-Formular an. Dieser Prozess läuft ungefähr 20-25 Minuten bei einem Einreichungsintervall von 3 Sekunden stabil. Wenn man den Speicherverbrauch beobachtet, gibt es nichts Wesentliches zu sehen, auch nicht stabil. Aber nach diesen 20-25 Minuten löst der Server eine StackOverflowException an der Stelle aus, an der der tcp-Stream deserialisiert wird, besonders beim Setzen der Image-Eigenschaft aus dem byte [] - Array.
Ich suchte gründlich nach rekursiven oder endlosen Schleifen, und angesichts der Tatsache, dass es nach Tausenden von erfolgreichen Intervallen auftritt, konnte ich mir das kaum vorstellen.
public byte[] ImageBase
{
get
{
MemoryStream ms = new MemoryStream();
_screen.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.GetBuffer();
}
set
{
if (_screen != null) _screen.Dispose(); //preventing well-known image memory leak
MemoryStream ms = new MemoryStream(value);
try
{
_screen = Image.FromStream(ms); //<< EXCEPTION THROWING HERE
}
catch (StackOverflowException ex) //thx to new CLR management this wont work anymore -.-
{
Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
}
ms.Dispose();
ms = null;
}
}
Ich hoffe, dass mehr Code unnötig wäre, oder es könnte sehr komplex ...
Bitte helfen Sie, ich habe überhaupt keine Ahnung mehr
thx Chris
Ich frage mich, was Sie in _screen = Image.FromStream (ms) tun, vielleicht setzen Sie ImageBase versehentlich? – Trap
Ich mag SO Fragen zu SO. – Mehrdad
sollten Sie die Verwendung von jedem MemoryStream wirklich in einen using() - Block schreiben, was es viel einfacher macht zu sehen, was richtig entsorgt wird! –