Speicher in C# freigeben ?
-
Nene, des lass mal. Dazu besteht fast nie ein Anlass, bzw. man muss gut darüber bescheid wissen, um sich durch explizites Aufrufen des GC einen Vorteil verschaffen können. Wenn dein Programmm immer mehr Speicher frisst, liegt es
- daran, dass du Dinger nicht Disposed, die Disposed werden soll (Texturen, Bilder, Socket-Verbindungen, Streams)
- daran, dass du immer mehr Objekte referenzierst. Der GC kann nichts einsammeln, wo du ne Referenz drauf hast.
-
der nachfolgende Code lässt den Speicherbedarf andauernd ansteigen - ich kann leider nicht erkennen wieso und wie sich das vermeiden lässt:
while ((fFile.Peek()!=-1)&&(fFile.Peek()!=32)&&(fFile.Peek()!=10)&&(fFile.Peek()!=13)) { strText = fFile.ReadLine().Split(",".ToCharArray()); fm1.progressBar1.Step=10000 / countlines; fm1.progressBar1.PerformStep(); cmd_insert = new OracleCommand("INSERT INTO blutspende (Vorname,Nachname,GebDatum,Strasse,Ort) VALUES ('"+strText[0]+"','"+strText[1]+"','"+strText[2]+"','"+strText[3]+"','"+strText[4]+"')",con); try { cmd_insert.ExecuteNonQuery(); } catch(Exception ex) { if(ex.Message=="ORA-00001: Verstoß gegen Eindeutigkeit, Regel (RKSKDB.SYS_C003342)" || ex.Message=="ORA-00001: Verstoß gegen Eindeutigkeit, Regel (RKSKDB.SYS_C003344)") { eintrag++; } else Console.WriteLine(ex.Message); } System.Windows.Forms.Application.DoEvents(); }
-
while ((fFile.Peek()!=-1)&&(fFile.Peek()!=32)&&(fFile.Peek()!=10)&&(fFile.Peek()!=13))
Das ist schon mal ugly. Arbeite mit der KeyCode-Aufzählung.
cmd_insert = new OracleCommand("INSERT INTO blutspende (Vorname,Nachname,GebDatum,Strasse,Ort) VALUES ('"+strText[0]+"','"+strText[1]+"','"+strText[2]+"','"+strText[3]+"','"+strText[4]+"')",con);
Davon abgesehen, dass dies auch ugly ist, muss man das OracleCommand vielleicht disposen?
Falls es eine Methode zum Freigeben der Resourcen hat, versuchs mal so:
OracleCommand blubb = null; try { blubb = new OracleCommand(...); ... } catch( ... ) { ... } finally { if( blubb != null ) blubb.gibResourcenFrei(); // Oft heißt das Dispose() }
-
Disposed hab ichs jetzt, aber bringen tuts leider nix
-
Stell nochmal ganz sicher, dass du es in jedem Fall disposed (vorzugsweise mit finally).
Falls ja, schau, ob es noch mehr Dinge gibt, die du nicht disposed. Falls nein, würd ich mir nen Memory Profiler ziehen und das Ganze verfolgen.
-
ich benutze Visual Studio .NET
gibt es da vielleicht eine Möglichkeit im Debugmodus die Speicherbelegung resp. Speichernutzung zu sehen ?
mfG
Daddy
-
Nein, aber such mal nach nem Tool "Memprof", das soll ganz gut sein. Ich selber habe das noch nie gebraucht. Du hast sicher nen Fehler irgendwo drin, aber vielleicht findest du ihn damit leichter.
-
Verwende für Deinen SQL String Parameter, denn so bist Du nicht gegen SQL Injection geschützt.
-
äh, welche würdest du mir empfehlen ? :):)
-