Laden...

Webbrowser Control - Zu viele Benutzer-Objekte

Erstellt von schoko01 vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.128 Views
S
schoko01 Themenstarter:in
23 Beiträge seit 2006
vor 8 Jahren
Webbrowser Control - Zu viele Benutzer-Objekte

Hi,

ich habe ein Anwendung die über einen Timer alle 30sec ein Webbrowser Control anlegt, den Status einer Seite abragt und nach einem Dispose() über Controls.Remove wieder entfernt wird.


            WebBrowser wb = new WebBrowser();
            //wb.Parent = new Control();
            wb.Parent = tabPage_xx;
            wb.Location = new Point(400,400);
            wb.Size = new Size(30, 30);
            wb.ScrollBarsEnabled = false;
            wb.Visible = false;
            wb.Name = "wb";
            wb.DocumentCompleted += new   WebBrowserDocumentCompletedEventHandler(webbrowser_DocumentCompleted);
            wb.Navigate(url);

.........
//Status überprüfen über HtmlElementCollection .......
.........

              foreach (Control con in tabPage_xx.Controls)
                {
                    if (con.Name == "wb")
                    {
                        con.Dispose();
                        this.Controls.Remove(con);
                    }
                }

Mein Problem dabei.
Im Taskmanager steigen die Benutzer-Objekte langsam an und nach einiger Zeit ist anscheinend die Grenze erreicht und die Anwendung wird nicht mehr korrekt angezeigt und hängt.
GC.Collect() brachte keine Verbesserung.

Danke für Eure Hilfe
lg Gerald

3.170 Beiträge seit 2006
vor 8 Jahren

Hallo,

wb.DocumentCompleted += new   WebBrowserDocumentCompletedEventHandler(webbrowser_DocumentCompleted);

Hängst Du den Handler auch irgendwo wieder ab?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schoko01 Themenstarter:in
23 Beiträge seit 2006
vor 8 Jahren

Hallo MarsStein

Danke für den Tipp, ich hab das mal so eingebaut


foreach (Control con in tabPage_xx.Controls)
                {
                    if (con.Name == "wb")
                    {
                        ((WebBrowser)con).DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(webbrowser_DocumentCompleted);
                        con.Dispose();
                        this.Controls.Remove(con);
                    }
                }

Leider zählen die Benutzer-Objekte immer noch hoch.

1.040 Beiträge seit 2007
vor 8 Jahren

Läuft er in die if-Abfrage rein?
Ich bin etwas verwundert, weil du einmal tabPage_xx.Controls und später this.Controls nutzt.

S
schoko01 Themenstarter:in
23 Beiträge seit 2006
vor 8 Jahren

Hallo P!lle

ja die if Schleife wird durchlaufen.

Hab das Entfernen des Controls mal auf tabPage_xx.Controls.Remove(con) geändert (Hatte ich übersehen 😃). Gebracht hats leider nichts.

Dispose sollte doch alle Ressourcen freigeben, oder liege ich da falsch??

P
1.090 Beiträge seit 2011
vor 8 Jahren

Dispose sollte doch alle Ressourcen freigeben, oder liege ich da flasch??

Jein, die nicht verwalten Ressourcen werden zwar freigegeben, werden aber vom GC noch so behandelt, als ob sie Speicher verbrauchen würden. Das ändert sich erst beim nächsten Collect.

Wie so erzeugst du es eigentlich immer neu. Ändere doch einfach die Visible eigenschaft.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

S
schoko01 Themenstarter:in
23 Beiträge seit 2006
vor 8 Jahren

Wie so erzeugst du es eigentlich immer neu. Ändere doch einfach die Visible eigenschaft.

Hatte das so am Anfang so umgesetzt.
Doch dann kamen die Speicher bzw. Benutzer-Objekt Fresser. Da ich das Webbrowser CTRL in Verdacht hatte, hab ichs jedesmal neu erzeugt.
Dachte das wäre die Lösung.

F
10.010 Beiträge seit 2004
vor 8 Jahren
  1. http://www.if-schleife.de/
  2. Wozu brauchst du ein WebBrowser Control? Geht nicht auch ein HttpWebRequest?
127 Beiträge seit 2015
vor 8 Jahren

Wie so erzeugst du es eigentlich immer neu. Ändere doch einfach die Visible eigenschaft.

Hatte das so am Anfang so umgesetzt.
Doch dann kamen die Speicher bzw. Benutzer-Objekt Fresser. Da ich das Webbrowser CTRL in Verdacht hatte, hab ichs jedesmal neu erzeugt.
Dachte das wäre die Lösung.

Demnach läge aber die Vermutung nahe das es ein Speicherleck im Webbrowser Control selbst gibt gegen das du nichts machen kannst.

S
schoko01 Themenstarter:in
23 Beiträge seit 2006
vor 8 Jahren

Erstmal Danke an alle für die schnellen Antowrten 👍

  1. Wozu brauchst du ein WebBrowser Control? Geht nicht auch ein HttpWebRequest?

Für die Statusabfrage der Website würds wahrscheinlich funktkioieren. Es sollen aber auch Eingabefelder der Website per Knopfdruck manipuliert werden. z.B. wenn sich der Status ändert.

Das erledige ich zur Zeit über HtmlElement aus einer HtmlElementCollection
Gibts da auch eine andere Möglichkeit??

F
10.010 Beiträge seit 2004
vor 8 Jahren

Das erledige ich zur Zeit über HtmlElement aus einer HtmlElementCollection
Gibts da auch eine andere Möglichkeit??

Wenn du gleich alles sagen würdest was du tun willst, wäre es einfacher dir wirklich zu helfen.

Aber in 90% der Fragen hier zu diesem Thema geht es dann darum unerlaubte ( AGB der Seite beachten ) sachen zu machen.
Denn eigentlich haben alle Webseiten die soetwas legal zulassen eigentlich eine API die man abfragen kann.