Hallo,
gibt es eine Möglichkeit herauszufinden, ob ein Hostname in einem Netzwerk existiert und dabei ein timeout limit zu setzen? Meine Anforderung ist, so schnell wie Möglich zu prüfen, ob ein Server existiert und ob er Antwortet.
Bei der folgenden Abfrage muss ich bis zu 30 Sekunden warten bis ich eine Antwort erhalte.
IPAddress[] IPs = Dns.GetHostAddresses(machine);
Jemand eine Idee?
Danke!
Hi!
Könntest die Anfrage in einem separaten Thread laufen lassen. Mach dir zusätzlich noch ein Flag, dass du vom neuen Thread aus füllst, wenn die Anfrage erfolgreich war.
Jetzt brauchst nur noch n Timer dem du einen von dir gewählten Timeout übergibst. Wenn der Timer abgelaufen ist und dein Flag ist noch nicht gefüllt brichst du den Thread ab und fertig.
Gruß dev
Hi,
Threads sind hier absolut unnötig. Erstmal wäre es mit Kanonen auf Spatzen geschossen, und zweitens sollte man niemals einen Thread abbrechen, sondern immer sauber auslaufen lassen. Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses
Gruß
Dario
Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses
Das löst aber das Problem nicht, dass er den Timeout nicht selbst festlegen kann.
Da du aber Recht hast, dass man Threads nicht unbedingt abbrechen sollte wäre es in diesem Fall besser den Thread einfach zu ende laufen zu lassen. Durch den Timer hat er ja trotzdem nach seinem Timeout ein Ergebnis. Entweder das Flag ist gesetzt oder eben nicht.
Im Übrigen ist der Einsatz eines Threads überhaupt nicht aufwendig wenn man auf die Möglichkeit des Abbrechen verzichtet: ThreadPool
Gruß dev
Hallo DeViL666.on,
bitte befass dich erstmal mit den Möglichkeiten und Einschränkungen des .NET Frameworks sowie des Threadings unter Windows und .NET.
Du brauchst nämlich in diesem Beispiel keinen Thread und keinen Threadpool. Das gibts bereits nahezu alles fasst fertig. Schau dir bitte folgende Links an:
Abgeborchener Thread soll nichts mehr schreiben
Asynchronous Programming Design Patterns
Hallo olimlad,
du kannst das IAsyncResult für einen Timeout verwenden.
IAsyncResult result = Dns.BeginGetHostAddresses(..., callbackFunc);
WaitHandle.AsyncWaitHandle.WaitOne(5000);
...
private void callbackFunction(IAsyncResult result ) {
Dns.EndGetHostAddresses(result);
}
Hinweis, ohne Aufruf von EndXY bei MS Implementierungen hat deine Anwendung ein Speicherleck, daher bitte immer bei BeginXY die passende EndXY-Methode aufrufen.
Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses
Das löst aber das Problem nicht, dass er den Timeout nicht selbst festlegen kann.Da du aber Recht hast, dass man Threads nicht unbedingt abbrechen sollte wäre es in diesem Fall besser den Thread einfach zu ende laufen zu lassen. Durch den Timer hat er ja trotzdem nach seinem Timeout ein Ergebnis. Entweder das Flag ist gesetzt oder eben nicht.
Im Übrigen ist der Einsatz eines Threads überhaupt nicht aufwendig wenn man auf die Möglichkeit des Abbrechen verzichtet:
>Gruß dev
Löst aber das Problem, dass der Rest der Anwendung nicht weiterläuft und ich glaube das ist hier auch eher das Problem, oder? Ansonsten hat kleines_eichhoernchen ja schon eine gute Lösung gepostet.