Problem bei Portabfrage



  • Hallo Leute,

    Ich habe eine kleine abfrage mit einem timer und tcpclient gemacht, ob ein port auf dem pc belegt ist oder nicht.

    void timer1_Tick( object sender, System.EventArgs e )
        {
            TcpClient tc = new TcpClient();
            try
            {
                tc.Connect( "127.0.0.1", 80 );
                label1.Text = "online";
            }
            catch ( Exception )
            {
                label1.Text = "offline";
            }
        }
    

    Nun zu meinem Problem: Sobald der Port nicht belegt ist, also ich offline anzeige fängt das fenster übelst an zu hacken beim ziehen. wenn online funktioniert alles ohne probleme.

    Währe dankbar für hilfe 🙂

    MFG
    Fabian


  • Administrator

    King48488 schrieb:

    Nun zu meinem Problem: Sobald der Port nicht belegt ist, also ich offline anzeige fängt das fenster übelst an zu hacken beim ziehen. wenn online funktioniert alles ohne probleme.

    1. Wenn der Port nicht belegt ist, dann wird aber doch "online" angezeigt. Also wann gibt es nun Probleme?
    2. Kannst du dieses Problem mal genauer beschreiben? Wie ein Fenster hacken kann, ist mir nämlich ein wenig ein Rätsel. Sonst hätte ich meine Fenster schon lange für die Gartenarbeit hier eingesetzt 🤡
    3. Wenn du mit "hacken" meinst, dass das Fenster nur noch mit Schwierigkeiten zu bewegen ist und ganz schlecht reagiert, dann könnte ich mir vorstellen, dass es daran liegt, dass die Verbindung fehlschlägt. Bis die Verbindung in Connect fehlschlägt, vergeht aber eine gewisse Zeit. Ein Timeout muss eintreffen. Solange wird der UI-Thread, in welchem das Tick-Event ausgeführt wird, allerdings blockiert. Somit können keine UI-Nachrichten mehr verarbeitet werden und das Fenster reagiert sehr verzögert.

    Grüssli



  • genau das fenster regaiert sehr langsam und ist sehr schwer zu bewegen.

    und wenn der port nicht belegt ist wird offline angezeigt. es soll dazu dienen, wenn z.B. der apache server auf port 80 belegt is das online angezgigt werden soll und wenn apahe down is offline aber wie gesagt das fenster reagiert dann kaum noch und lässt sich schwer beheben und ich finde einfach keine lösung


  • Administrator

    King48488 schrieb:

    und wenn der port nicht belegt ist wird offline angezeigt. es soll dazu dienen, wenn z.B. der apache server auf port 80 belegt is das online angezgigt werden soll und wenn apahe down is offline aber wie gesagt das fenster reagiert dann kaum noch und lässt sich schwer beheben und ich finde einfach keine lösung

    Ach, so hast du das mit dem "belegt" gemeint. Wieso hast du nicht gleich geschrieben, dass das Fenster Probleme macht, wenn der Apache Server down ist. Oder wenn der Port 80 geschlossen ist. Dann wäre es deutlich verständlicher 🙂

    Das Problem habe ich dir allerdings bereits erläutert. Der UI-Thread wird von Connect blockiert und kann somit nicht mehr die UI-Nachrichten verarbeiten. Unter Windows funktioniert alles über Nachrichten und diese müssen von einem GUI verarbeitet werden. Wenn du in diesem Thread, welcher diese Nachrichten verarbeitet, eine blockierende Funktion hast, dann reagiert auch das GUI nicht mehr.

    Du musst also die Arbeit in einen eigenen Thread auslagern. Oder du verwendest zum Beispiel die Funktion BeginConnect von TcpClient , welche den Verbindungsaufbau asynchron durchführt.
    Vergiss dabei aber nicht, dass man von anderen Threads nicht einfach so auf das GUI zugreifen darf. Unter WPF muss man dazu den Dispatcher verwenden, welcher man in jedem Control finden kann. Bei WinForms hat jedes Control eine Invoke , bzw. BeginInvoke , Methode.

    Grüssli



  • bin ja noch nich so lange bei c# dabei, deswegen noch net mit threads gearbeitet.



  • habe es jetzt mit dem backgroundworker und nen timer gelöst, geht wunderbar:

    void bgWorker_DoWork( object sender, System.ComponentModel.DoWorkEventArgs e )
            {
                TcpClient tc = new TcpClient();
                try
                {
                    tc.Connect( "127.0.0.1", 3724 );
                    label1.Text = "online";
                }
                catch ( Exception )
                {
                    label1.Text = "offline";
                }
            }
    
            void portTimer_Tick( object sender, EventArgs e )
            {
                try
                {
                    bgWorker.RunWorkerAsync( 100 );
                }
                catch
                {
                    bgWorker.CancelAsync();
                }
            }
    


  • Ich hoffe, du hast da nirgends ein CheckForIllegalCrossThreadCalls = false vor uns versteckt. Es sieht nämlich ganz danach aus. 😉
    Im DoWork-Event kannst du normalerweise auch nicht auf die GUI zugreifen.



  • nee hab nix vor euch versteckt 😛

    geht alles wunderbar er zeig es mit off und online gut an


Log in to reply