Benutzer mit den meisten Antworten
Wie nutzt man BeginInvoke in der WPF?

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!
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
Alle Antworten
-
Hallo,
was Control.Invoke bei Windows Forms ist, ist der Dispatcher bei WPF,
siehe Build More Responsive Apps With The DispatcherHilfreich können einige Erweiterungen sein; siehe z. B.
Good practice to use Dispatcher in WPF background threadGruß Elmar
-
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
-
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