Laden...

Webbrowser.Dispose();

Erstellt von blutiger_anfänger vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.320 Views
B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren
Webbrowser.Dispose();

Hallo liebe Community,
ich habe da eine kurze Frage. Hab' auch schon gegooglt, aber irgendwie finde ich nicht s wirkliches auf meien Frage.

Also ich habe eine Anwendung mit einem webbrowser control. Nach einigerzeit frisst das aber schon sehr viel Arbeitsspeicher. Besser gesagt mit jeder aufgerufenen Homepage. Von daher hab ich ein wenig gegooglet und bin auf

webbrowser.dispose();

gestoßen... Nun meine eigentliche Frage. Wie bekomme ich mein webbrowser Control wieder zum laufen, nach dem ich webbrowser.dispose(); gemacht habe?

Ich meine beim Dispose wird es ausgeblendet.
Ich habe es schon mit

Webbrowser webbrowser1 =  new Webbrowser();

probiert, jedoch passiert da oberflächen technisch nichts. Das Element ist immernoch nicht sichtbar.
Falls es euch weiterhilft - ich habe das webbrowser element über den Designer hinzugefügt, also nciht von Hand instanziert...

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

Controls.Add fehlt

herbivore

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

Das haut irgendwie nicht ganz hin...

Also ich probiers nochmal besser zu erklären.
Ich habe eine Forms Anwendung. Dort hab ich über die Toolbox ein WebbrowserControl hinzugefügt. Dieses Webbrowser Control hat den Namen "webbrowser1".

Nun habe ich in den DocumentComplete EventHandler "webbrowser1.dispose();" gesetzt. Mit dem Dispose verschwindet das Element von der Oberfläche meines Forms.

Mit "Controls.Add(webbrowser1);" taucht es jedoch auch nicht mehr auf...

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo blutiger_anfänger,

du hast doch den Code, der ein WebBrowser-Control erzeugt (in xyz.Designer.cs). Den musst du einfach nur nehmen.

Siehe auch Control wird nicht angezeigt

herbivore

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Mit Webbrowser.Dispose zerstörst du deinen Brauser, aber du willst doch weiterbrausen.
Anhand deiner Infos sollte kein Speicher-Leck auftreten. Du machst doch nicht irgendwo ständig Webbrowser ... = new Webbrowser(); ?

Die Speicherverwaltung von .Net wird eh nicht korrekt im Taskmanager wiedergegeben - .Net frißt viel mehr, alses eigentlich braucht, gibts aber bei Anforderung brav wieder zurück (und du guckst den TM, und denkst "Hilfe, mein Memory!").

Und kann auch sein, daß im Webbrowser - Control selbst tatsächlich ein Ressourcen-Leck drinne ist - diesen AxInterop - Komponenten trau ich irgendwie nicht recht.

Wieviel Speicher frisstes denn?

Der frühe Apfel fängt den Wurm.

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

viel zu viel...

dem programm wird eine liste mit domains gegeben, die es aufrufen soll und checken ob sie online sind, und mit einer regurlar expression kurz überprüfen ob ein bestimmter wert vorhanden ist.

für ca. 80 mal webbrowser.navigate, braucht er ob mit oder ohne dispose laut tasmanager knapp 250mb ram... und das kann eigentlich nicht sein...

Wenn ich nicht hier bin, findest du mich auf code-bude.net.

5.299 Beiträge seit 2008
vor 15 Jahren

Ah, könnte mir vorstellen, daß du irgendwie Document-Objekte erstellst. Und wenn das auch Com-Objekte sind muß man die speziell disposen - hach habich vergessen.

Aber insgesamt solltest du einfach mal die Klasse System.Net.WebRequest angucken.
Das ist ein managed Objekt, und du kriegst die Ressource direkt in den Speicher, und brauchst sie nicht aus diesem Webbrauser-Monstrum herauszufummeln.

Hier was aus VB übersetztes:

private void DownloadHTTP(string Src, string Dest)
{
	StatusMessage("Begin Download", Tab, Src, " -> ", Path.GetFileName(Dest));
	WebRequest Request = HttpWebRequest.Create(Src);
	using (WebResponse Response = Request.GetResponse()) {
		using (IO.StreamReader Reader = new IO.StreamReader(Response.GetResponseStream(), true)) {
			using (IO.StreamWriter Writer = new IO.StreamWriter(Dest, false, Reader.CurrentEncoding)) {
				//gepufferter Download - es werden maximal je 32767 Zeichen in den Speicher geladen
				char[] Buf = new char[short.MaxValue];
				do {
					int Portion = Reader.Read(Buf, 0, Buf.Length);
					Writer.Write(Buf, 0, Portion);
				}
				while (!(Reader.EndOfStream));
			}
		}
	}
	StatusMessage("Download finished", Tab, Path.GetFileName(Dest));
}

Ist im Nebenthread auszuführen, damit das GUI nicht blockiert

Der frühe Apfel fängt den Wurm.

130 Beiträge seit 2005
vor 15 Jahren

In diesem Fall solltest du vielleicht nicht das Webbrowser-Control nehmen sondern nur die jeweilige Seite alleine, also meinetwegen index.html aufrufen/runterladen und darüber dann auf deinen Wert prüfen. Mit dem Webbrowser-Control hast du sonst einen riesigen Overhead in Form von Bildern usw. Vor Allem wird die Seite ja noch gerendert, was in deinem Fall so wie ich es verstanden habe völlig unnötig ist.

Edit: Zu langsam 🙂

B
blutiger_anfänger Themenstarter:in
293 Beiträge seit 2008
vor 15 Jahren

stimmt... am anfang wollt ich ja die seiten auch noch angezeigt bekommen, da hat das webbrowser control sinn gemacht... naja und wenns erstmal steht wieder alles umzumodeln ist dann auch immer so ne sache. Aber ihr habt schon recht.... Werd mich hinsetzen und das ganze mit webrequests lösen...

...und wenn es dann immernoch so viel speicher frisst - fress ich nen besen... 😉

Wenn ich nicht hier bin, findest du mich auf code-bude.net.