kostenloser Webspace werbefrei: lima-city


C# XML vom Server auswerten -> sehr langsam

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    Hallo LC,
    ich habe in C# ein Programm geschrieben das eine XML Datei die auf meinen Server liegt alle x sec auswertet. Ich prüfe per ping abfrage ob der server überhaupt erreichbar ist.

    String host = "server.de/xml.xml";
                byte[] buffer = new byte[32];
                int timeout = 1000;
    
                try
                {
                    Ping p = new Ping();
                    PingOptions pingOptions = new PingOptions();
                    PingReply reply = p.Send(host, timeout, buffer, pingOptions);
    
                    if (reply.Status == IPStatus.Success)
                    {
    
    using (var client = new WebClient())
                        {
        string reply = client.DownloadString (address);
    //hier wird die XML ausgewertet
    
    }
    }
    }
     catch
    {
    //keine verbindung
    }


    Solang man eine halbwegs gute Internetverbindung hat geht das auch wunderbar aber sobald die Verbindung etwas langsamer wird fängt das Programm total an zu laggen.

    Ich denke es würde schon besser laufen wenn ich xml Datei nicht erst anpingen müsste sondern bei der Funktion WebClient prüfen könnte ob der Server antwortet.

    Hat jemand ne idee wie ich das anders machen könnte?

    LG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo christian1603,

    das Dein Programm bei einer langsamen Verbindung nur noch schlecht reagiert, liegt daran, dass Dein Programm bei p.Send() und client.DownloadString() wartet bis die Ergebnisse da sind. Und solange Dein Programm da wartet kann es nicht auf andere Ereignisse reagieren.
    Die Lösung des Problemes liegt in der Verwendung mehrerer Threads, d.h. der Ping und der Download sollten in einem parallelen Thread laufen, damit Dein Hauptthread (->"das Programm" bzw. "die GUI") nicht blockiert werden.
    Du kannst Dir dazu ja mal folgendes durchlesen:
    http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_11_001.htm
    Die offizielle Dokumentation ist hier:
    http://msdn.microsoft.com/de-de/library/ms173178%28v=vs.80%29.aspx
    Besonderes Augenmerk solltest Du dabei auf diesen Abschnitt legen:
    http://msdn.microsoft.com/de-de/library/ms173179%28v=VS.80%29.aspx

    Viel Erfolg!
  4. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo christian1603,

    das Dein Programm bei einer langsamen Verbindung nur noch schlecht reagiert, liegt daran, dass Dein Programm bei p.Send() und client.DownloadString() wartet bis die Ergebnisse da sind. Und solange Dein Programm da wartet kann es nicht auf andere Ereignisse reagieren.
    Die Lösung des Problemes liegt in der Verwendung mehrerer Threads, d.h. der Ping und der Download sollten in einem parallelen Thread laufen, damit Dein Hauptthread (->"das Programm" bzw. "die GUI") nicht blockiert werden.
    Du kannst Dir dazu ja mal folgendes durchlesen:
    http://openbook.galileocomputing.de/visual_csharp_2010/visual_csharp_2010_11_001.htm
    Die offizielle Dokumentation ist hier:
    http://msdn.microsoft.com/de-de/library/ms173178%28v=vs.80%29.aspx
    Besonderes Augenmerk solltest Du dabei auf diesen Abschnitt legen:
    http://msdn.microsoft.com/de-de/library/ms173179%28v=VS.80%29.aspx

    Viel Erfolg!

    Ok Danke erstmal,
    ich habe seit Gestern Abend schon denn ein oder anderen versuch damit erstellt musste nur leider feststellen das ich zu doof bin innerhalb eines Thread nicht auf ein Objekt (z.b Textbox) zugreifen kann.
    Habs mal so versucht:
    Form1 obsj = new Form1();
                        obsj.richTextBox1.Text = "hi";


    ohne erfolg..

    Beitrag zuletzt geändert: 2.4.2011 12:31:04 von christian1603
  5. Hallo christian1603,

    das hat mit doof nichts zu tun. Es ist nur ein komplexer Themenbereich in den man sich erst einmal einarbeiten muss. Und das dauert halt ein paar Tage/Wochen.
    Soweit ich weis, kann man aus einem Thread auch nicht direkt auf die GUI zugreifen. Eine Möglichkeit es indirekt zu machen ist über Delegates und die Control.Invoke() Methode.
    Ich gehe mal davon aus, dass Du eine Referenz auf Form1 (nennen wir sie mal 'f') in Deiner Klasse hast.
    Dann brauchst Du Folgendes:
    private void SetRichEditText(string text)
    {
        f.richTextBox1.Text = text;
    }
    
    private delegate void SetRichEditTextCallback(string text);
    In Deiner Thread-Methode musst Du dann folgendes machen:
    f.Invoke(new SetRichEditCallback(this.SetRichEditText),
            new object[]{"hi"});

    Mit Invoke() wird dann die Methode SetRichEditText() aufgerufen und als Argument "hi" übergeben.
  6. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo christian1603,

    das hat mit doof nichts zu tun. Es ist nur ein komplexer Themenbereich in den man sich erst einmal einarbeiten muss. Und das dauert halt ein paar Tage/Wochen.
    Soweit ich weis, kann man aus einem Thread auch nicht direkt auf die GUI zugreifen. Eine Möglichkeit es indirekt zu machen ist über Delegates und die Control.Invoke() Methode.
    Ich gehe mal davon aus, dass Du eine Referenz auf Form1 (nennen wir sie mal 'f') in Deiner Klasse hast.
    Dann brauchst Du Folgendes:
    private void SetRichEditText(string text)
    {
        f.richTextBox1.Text = text;
    }
    
    private delegate void SetRichEditTextCallback(string text);
    In Deiner Thread-Methode musst Du dann folgendes machen:
    f.Invoke(new SetRichEditCallback(this.SetRichEditText),
            new object[]{"hi"});

    Mit Invoke() wird dann die Methode SetRichEditText() aufgerufen und als Argument "hi" übergeben.



    Cool Danke,
    keine ahung ob ich was falschgemacht habe aber es kommt "Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde."

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Demo obj = new Demo();
                ThreadStart del = new ThreadStart(obj.TestMethod);
                Thread thread = new Thread(del);
                thread.Start(); 
            }
           
    
        }
    
    
        class Demo
        {
    
            Form1 f = new Form1();
            private void SetRichEditText(string text)
            {
                f.richTextBox1.Text = text;
            }
            private delegate void SetRichEditTextCallback(string text);
    
            public void TestMethod()
            {
                try
                {
    
                    Thread.Sleep(3000);
                  
                f.Invoke(new SetRichEditTextCallback(this.SetRichEditText), new object[] {"hi"});
                       
                    
                }
                catch
                {
                    MessageBox.Show("Fehler");
    
    
                }
                finally
                {
                    MessageBox.Show("Ende");
                }
    
    
    
            }
        }

    mh
  7. Hallo christian1603,

    ja, da habe ich wohl was übersehen.
    Probiere mal folgendes:
    public Form1()
    {
        InitializeComponent();
        this.CreateControl();
    }
  8. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo christian1603,

    ja, da habe ich wohl was übersehen.
    Probiere mal folgendes:
    public Form1()
    {
        InitializeComponent();
        this.CreateControl();
    }


    mh immer noch das selbe "invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde."

    LG :wave:

    Beitrag zuletzt geändert: 2.4.2011 19:24:45 von christian1603
  9. Hallo christian1603,

    wenn das jetzt nicht funktioniert, dann bin ich von der Dokumentation aber schwer enttäuscht :pissed:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.CreateControl();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            Demo obj = new Demo(this);
            ThreadStart del = new ThreadStart(obj.TestMethod);
            Thread thread = new Thread(del);
            thread.Start(); 
        }
    }
    
    class Demo
    {
        private Form1 f;
        private delegate void SetRichEditTextCallback(string text);
    
        public Demo(Form1 frm)
        {
            f = frm;
        }
    
        private void SetRichEditText(string text)
        {
            f.richTextBox1.Text = text;
        }
    
        public void TestMethod()
        {
            try
            {
                Thread.Sleep(3000);
                f.Invoke(new SetRichEditTextCallback(this.SetRichEditText), new object[] {"hi"});    
            }
            catch
            {
                MessageBox.Show("Fehler");
            }
            finally
            {
                MessageBox.Show("Ende");
            }
        }
    }
  10. Autor dieses Themas

    christian1603

    Kostenloser Webspace von christian1603

    christian1603 hat kostenlosen Webspace.

    darkpandemic schrieb:
    Hallo christian1603,

    wenn das jetzt nicht funktioniert, dann bin ich von der Dokumentation aber schwer enttäuscht :pissed:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.CreateControl();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            Demo obj = new Demo(this);
            ThreadStart del = new ThreadStart(obj.TestMethod);
            Thread thread = new Thread(del);
            thread.Start(); 
        }
    }
    
    class Demo
    {
        private Form1 f;
        private delegate void SetRichEditTextCallback(string text);
    
        public Demo(Form1 frm)
        {
            f = frm;
        }
    
        private void SetRichEditText(string text)
        {
            f.richTextBox1.Text = text;
        }
    
        public void TestMethod()
        {
            try
            {
                Thread.Sleep(3000);
                f.Invoke(new SetRichEditTextCallback(this.SetRichEditText), new object[] {"hi"});    
            }
            catch
            {
                MessageBox.Show("Fehler");
            }
            finally
            {
                MessageBox.Show("Ende");
            }
        }
    }



    Du musst nicht enttäuscht sein :-) Klappt WUNDERBAR ! Danke das du dir immer so viel Arbeit machst!
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!