Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Programm soll nichts tun, bis Rechner online ist
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

Programm soll nichts tun, bis Rechner online ist

beantworten | zitieren | melden

Also zunächst möchte ich nochmal sagen, dass ich Anfänger bin. Also steinigt mich für den folgenden Code (der ja immerhin schonmal funktioniert) nicht. Das das ganze ein bisschen Murks ist weis ich, deswegen möchte ich fragen, wie man es besser machen kann.

Ziel ist es, dass das Programm erst los läuft, sobald der Computer eine Internetverbindung hat. Dazu teste ich alle 10 Sekunden, ob www.google.de erreichbar ist. Erst wenn das geschieht hören die Versuche auf und das Programm läuft los. Aber hier erstmal, was ich so zusammengebaut habe:


        bool isOnline = false;

        public void testping() {
            try  {
                Ping ping = new Ping();
                PingReply pingReply = ping.Send("www.google.de");
                if (pingReply.Status == IPStatus.Success) {
                    isOnline = true;
                }
            } catch {
                Thread.Sleep(10000); // 10 Sekunden nichts machen
            }
        }

        private void Form1_Load(object sender, EventArgs e) {

            while(isOnline == false) {
                testping();
            }
// Und hier geht das eigentliche Programm los
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15975

beantworten | zitieren | melden

Über die Art und Weise lässt sich streiten, aber im Endeffekt gibts keine andere Möglichkeit verlässlich den Internetstatus zu prüfen, als ne Webseite / ein Endpunkt im Internet zu erreichen.

Generell: mit Tasks kann man viel ressourcenschonender "Warten" als mit Thread.Sleep.
Ansonsten kannst Dich natürlich immer von Google Suche nach "c# wait for internet connection" inspirieren lassen, wie es noch so geht - je nachdem auch welcher Anwendungstyp.

PS: das ist ein Review-Thema.
Bitte nächstes Mal sowas auch im Review-Bereich posten ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

Sorry, irgendwie müsst ihr meine Threads immer rumschieben :-(

Es geht glaube ich eher darum, dass ich das Programm in eine Endlosschleife schicke, sofern keine Internetverbindung besteht und es sich quasi aufhängt und der Fehler nicht sauber behandelt wird. So wurde mir das damals in einem anderen Forum (in dem ich nicht mehr aktiv bin) gesagt. Deswegen eben die Frage, ob und wie man das vernünftig löst.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Little Tester am .
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1496
Herkunft: Düsseldorf

beantworten | zitieren | melden

Dann zähle, wie oft es nicht funktioniert hat und ab einer bestimmten Anzahl zeigst Du einen Fehler an.

Dass sich alles aufhängt, kannst Du nur (sinnvolle) mit dem Task-based asynchronous pattern lösen.
Das solltest Du aber nicht "irgendwie" nutzen, die Lernhürde ist hoch und um es richtig nutzen zu können, musst Du es auch verstanden haben.

Ich persönlich würde es aber ganz anders machen.
Ich würde eher Verbindungsfehler entsprechend behandeln und anzeigen.
Der Nutzer kann weiterhin das Programm nutzen, bekommt bloß immer angezeigt, dass keine Verbindung notwendig ist.
Oder Du machst es wie z.B. Outlook und zeigst irgendwo im Programm an, dass es keine Verbindung gibt.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 284

beantworten | zitieren | melden

Ich würde noch die globale Variable raus nehmen und die Antwort von der Methode zurückgeben lassen.

Aber wie Palladin007 sagt, ist es wahrscheinlich schlauer, vor einer bestimmten Aktion zu Prüfen.
Kann ja sein dass du 10 Sek. nach erfolgreichen Start kein Internet mehr hast.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2132

beantworten | zitieren | melden

Was macht der Ping wenn er keine Antwort kriegt, fällt der dann wirklich in eine Exception oder gibt das einen Status zurück?
Dann wäre dein Programm nämlich weit davon entfernt "nichts zu tun", weil es dann permanent ständig pingen würde :-)
private Nachricht | Beiträge des Benutzers
Little Tester
myCSharp.de - Member



Dabei seit:
Beiträge: 77

Themenstarter:

beantworten | zitieren | melden

Es gibt leider wirklich eine Exception. Offline oder nicht vorhandener Host ist offenbar nicht vorgesehen
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1870
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

Ist auch so dokumentiert, wenn es Probleme beim senden/empfangen der ICMP Meldungen gibt.
In dem Fall bekommst du auch eine PingException mit entsprechenden Status Informationen.
Da ICMP auch teilweise geblockt werden, wirst du dies vermutlich auch häufiger bekommen.
Du musst aber alle Fälle abdecken sprich Exceptions sowie Status Meldungen über nicht erreichbar oder offline.

Doku:
Ping.Send Methode (System.Net.NetworkInformation)

T-Virus
Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
private Nachricht | Beiträge des Benutzers