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
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
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.
Läuft er in die if-Abfrage rein?
Ich bin etwas verwundert, weil du einmal tabPage_xx.Controls und später this.Controls nutzt.
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??
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:
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.
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.
Erstmal Danke an alle für die schnellen Antowrten 👍
- 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??
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.