Anzeige

[C#] RAM läuft voll


Bu11it

Grünschnabel
#1
Hallo,

wie der Titel schon sagt ist mein Problem das der RAM vollläuft. Das Problem ist ich habe keine Ahnung an was das lief. Das Programm lief immer problemlos. Dann hab ich wohl eine Änderung gemacht die jetzt Probleme macht. Es ist recht umfangreich inzwischen deswegen kann ich hier nicht den ganzen Code posten. Aber ich erhoffe mir einige Anhaltspunkte. Ich habe in Visual Studio mitloggen lassen und 2013_04_27_11_27_21_Browser_Microsoft_Visual_Studio.png

Laut dem Log sollte Application.DoEvents schuld sein. Das rufe ich auf, während eine Webseite im Webbrowsercontrol geladen wird. Aber das belegt doch keine Arbeitsspeicher oder? Und warum räumt der Garbagecollector nicht auf.

Ich hoffe ihr könnt mir helfen.

Viele Grüße
Bu11it
 

saftmeister

Nutze den Saft!
Premium-User
#2
Solange man nicht weiß, was genau die Methode DoEvents macht, kann man da kaum weiter helfen. Vermutung:

Statische Liste, Vector, was auch immer und du hängst lustig Objekte rein. Die kann der GC nicht aufräumen, da static nun mal static ist. Einmal allokiert wirds erst am Programm-Ende freigegeben oder wenn man es explizit auf null setzt.
 
#4
Kann es sein dass du einen Stackoverflow bekommst?

So wie ich das sehe rufst du DoEvents innerhalb eines Timers auf welcher wiederum von der Funktion DoEvents aufgerufen wird.
Daraus entsteht ein rekursiver Aufruf und wenn der Seitenaufbau nicht schnell genug nach kommt läuft der Speicher voll und die Anwendung kann irgendwann nicht fortgesetzt werden.
 

Bu11it

Grünschnabel
#5
Hallo,

vielen Dank für deine Antwort. Die DoEvents() in dem Timer ist tatsächlich eine der nachträglichen Änderungen. Ich werde das gleich mal überprüfen. Danke für den Tipp. Meld mich wieder soweit ich mehr weiß :). Exception gibts nicht.
 

Bu11it

Grünschnabel
#6
Hallo,

ich sehe kein Problem mit den Timern. Ich habe alle deaktiviert und es wird nicht weniger Speicher verbraucht.
Der Fehler liegt vermutlich in folgendem Codeteil. Den dieser wird von allen meinen Methode aufgerufen während eine Seite lädt.
Das Flag navigated wird von einem Handler des Navigated Events gesetzt.
Code:
public void load()//geprüft
        {
            DateTime stamp = DateTime.Now.AddMinutes(2);
            while (!navigated)
            {
                Application.DoEvents();
                if (stamp < DateTime.Now)
                    throw new TimeOutException();
            }
            while (ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                if (stamp < DateTime.Now)
                    throw new TimeOutException();
            }
            sleep(1);
            try
            {
                if (Document.GetElementById("adBreaker") != null)
                {
                    navigated = false;
                    Navigate(basicURL);
                    while (!navigated)
                        Application.DoEvents();
                    while (ReadyState != WebBrowserReadyState.Complete)
                        Application.DoEvents();
                }
            }
            catch (Exception ex)
            {
                navigated = false;
                Navigate(basicURL);
                while (!navigated)
                    Application.DoEvents();
                while (ReadyState != WebBrowserReadyState.Complete)
                    Application.DoEvents();
            }
        }
 

ksk

Erfahrenes Mitglied
#7
... ja, das Problem hatte ich auch.
Ich gehe mal davon aus das du WebBrowser-objekt oder ähnliches verwendest.

Prüfe zuerst mal den Exception-Teil. Falls dort ein Fehler auftritt (Bsp. In der Methode Navigate) dann
wird dieser Fehler immer wieder auftauchen und schon ist der StackOverFlow da.

Sonst müsstest den RAM mittels GC (GarbageCollector) löschen.
So hats dann bei mir geklappt, jedoch muss ich noch dazu sagen das in meinem Fall mehrere
Connections aufgebaut wurden und ich auf diese Mitteln zugreifen musste.
Code:
GC.Collect();
Falls "GC.Collect" dir nicht weiterhelfen sollte dann gib bescheid.

Lg
ksk
 

MCoder

Premium-User
#8
Hallo,

du solltest über ein Design ohne DoEvents() nachdenken. Alle langlaufenden Aktionen gehören in einen Thread (Backgroundworker) ausgelagert.

Gruß
MCoder
 
Anzeige
Anzeige