none
Wie nutzt man BeginInvoke in der WPF? RRS feed

  • Frage

  • Hallo, an alle die dass hier lesen.

    Ich habe vor ein paar Wochen begonnen einen Chat-client zu programmieren.

    Am Anfang habe ich in WinForms programmiert, aber nun habe ich zu der WPF gewechselt.

    Jetzt habe ich folgendes Problem:

                if (this.InvokeRequired)
                    this.Invoke(new MethodInvoker(msg));
                else
                    textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + readData;

    Habe ich in WinForms benutzt, ich habe aber keine Ahnung wie das in der WPF geht.

    Kann mir irgendwer helfen und den Code vielleicht ausbessern?

    (Ich bin ein neu hier, habe also noch wenig Erfahrung...)

    Danke im vorraus!

    Samstag, 14. Januar 2012 09:21

Antworten

  • Hallo,

    ein wenig lesen (und verstehen) wirst Du schon müssen...

    this.Dispatcher.Invoke(new Action<TextBox>(
       textBox => textBox.Text += Environment.NewLine + " >> " + readData),
       this.textBox1);
    

    was ich im wesentlichen einem der obigen Texte entnommen und Deinen Code hinein gepflanzt habe.

    InvokeRequired entspräche dann CheckAccess, wo Du ein weiteres Beispiel findest.

    Gruß Elmar

    • Als Antwort markiert tea time Samstag, 14. Januar 2012 14:49
    • Bearbeitet Elmar BoyeEditor Samstag, 14. Januar 2012 15:49
    Samstag, 14. Januar 2012 14:35
    Beantworter

Alle Antworten

  • Hallo,

    was Control.Invoke bei Windows Forms ist, ist der Dispatcher bei WPF,
    siehe Build More Responsive Apps With The Dispatcher

    Hilfreich können einige Erweiterungen sein; siehe z. B.
    Good practice to use Dispatcher in WPF background thread

    Gruß Elmar

    Samstag, 14. Januar 2012 10:33
    Beantworter
  • Danke für die Links.

    Aber wie setzt man dass hierfür um?

            private void text()
            {
                if (this.InvokeRequired)
                    this.Invoke(new MethodInvoker(msg));
                else
                    textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + readData;
            } 

    Hier hat man den text code der readdata in die Textbox schreibt. Leider in WinForms.

    Wenn ich nur

            private void text()
            {
                    textBox1.Text = textBox1.Text + Environment.NewLine + " >> " + readData;
            } 

    schreibe, kommt diese Fehlermeldung:

    "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."

    Also muss ich es mit dem Dispatcher machen.

    Aber wie geht das in meinem Fall?

    Danke im Vorraus!

    • Bearbeitet tea time Samstag, 14. Januar 2012 13:45
    Samstag, 14. Januar 2012 10:37
  • Hallo,

    ein wenig lesen (und verstehen) wirst Du schon müssen...

    this.Dispatcher.Invoke(new Action<TextBox>(
       textBox => textBox.Text += Environment.NewLine + " >> " + readData),
       this.textBox1);
    

    was ich im wesentlichen einem der obigen Texte entnommen und Deinen Code hinein gepflanzt habe.

    InvokeRequired entspräche dann CheckAccess, wo Du ein weiteres Beispiel findest.

    Gruß Elmar

    • Als Antwort markiert tea time Samstag, 14. Januar 2012 14:49
    • Bearbeitet Elmar BoyeEditor Samstag, 14. Januar 2012 15:49
    Samstag, 14. Januar 2012 14:35
    Beantworter
  • Danke

    Es geht nun.


    • Bearbeitet tea time Samstag, 14. Januar 2012 16:40
    Samstag, 14. Januar 2012 14:43