Ping als Speicherfresser

13/11/2009 - 19:42 von Carsten Ilwig | Report spam
Hallo Leute,

ich habe nachfolgenden Testcode zum feststellen, ob eine IP-Adresse
verfügbar ist, oder nicht.
Das versenden des Pings wird über einen Timer gesteuert, da sich jederzeit
der Status der IP àndern kann und dieses festgestellt werden soll.
Nun habe ich aber das Problem, dass mit jeden Ping auch immer 8 KB des
Hauptspeichers verlorengehen.
Das Anwachsen des vom Programm belegten Speichers kann man im Taskmanager
"sehr schön" beobachten.
Da das Tool permanent im Hintergrund auf einem Server laufen soll, ist das
natürlich nicht akzeptabel.

Kann ich irgendwie verhindern, dass dies geschieht, oder gibt es vielleicht
eine andere (speicherschonende) Methode um festzustellen, ob eine IP-Adresse
verfügbar ist, oder nicht?


Hier das Testprogram:

using System.Net.NetworkInformation;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
private static AutoResetEvent autoEvent = null;
private static Ping pingSender = null;

static void Main(string[] args)
{
autoEvent = new AutoResetEvent(false);
pingSender = new Ping();
Timer _timer = new Timer(_timerCallBack, autoEvent, 1000, 100);
autoEvent.WaitOne(10000);
_timer.Dispose();
_timer = null;
}

private static void _timerCallBack(object _status)
{
pingSender.Send("192.168.178.33", 100);
}
}
}

Vielen Dank für Eure Hilfe.
Carsten
 

Lesen sie die antworten

#1 Frank Dzaebel
13/11/2009 - 21:15 | Warnen spam
Hallo Carsten,

Das versenden des Pings wird über einen Timer gesteuert, da sich jederzeit
der Status der IP àndern kann und dieses festgestellt werden soll.
Nun habe ich aber das Problem, dass mit jeden Ping auch immer 8 KB des
Hauptspeichers verlorengehen.



Also "früher" gab es gewisse Dinge diesbzgl.:

[Memory leaks in the .NET 2.0 Ping class - Marc Charbonneau's Blog]
http://blog.mbcharbonneau.com/2006/...ory-leaks/

[Ping Class (System.Net.NetworkInformation)]
http://msdn.microsoft.com/en-us/lib....ping.aspx
(unten im Community-Eintrag)

Aber mache Dir ggf. mal das Prinzip der .NET Garbage Collection klar. Die
Send-Methode versucht ja intern eine entsprechende ICMP-Echoantwortmeldung
von dem Ziel-Computer zu empfangen. Dadurch wird intern Speicher belegt, der
aber eben vom GC auch irgendwann automatisch *aufgeràumt* wird. Das ist also
alles ganz normal. Nur, ich verstehe schon ... andere (bzw. Admins) könnten
ja das Prinzip nicht verstehen - und deswegen könntest Du ggf. alle ~40
Sekunden einen GC.Collect / GC.WaitForPendingFinalizers
ausführen. Dann würdest Du sehen, dass der Speicherverbrauch auf Dauer nicht
hoch geht (bei aktueller .NET Version mit SPs). Du könntest zur Verifikation
in diesem Fall auch den Schàtzwert: GC.GetTotalMemory(false) im Timer
ausgeben lassen, dann brauchst Du nicht immer in den Taskmanager schauen.

BTW: nutze keine Unterstriche in den Namen - und schon gar nicht in lokalen
Variablen oder gar als Anfang eines Methodenaufrufes.

[Allgemeine Benennungskonventionen]
http://msdn.microsoft.com/de-de/lib...29045.aspx

Evtl. ist auch nicht unwichtig, dass nicht jeder Rechner
Ping's beantworten muss.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen