C# 在WPF应用程序中的线程(任务)中的文本框上写入

C# 在WPF应用程序中的线程(任务)中的文本框上写入,c#,wpf,multithreading,visual-studio,task,C#,Wpf,Multithreading,Visual Studio,Task,我有一个程序(在WPF应用程序中),它通过线程从COM端口接收信息。 以下是其中的一部分: static async Task ReceiveData(SerialPort port) { try { Thread.Sleep(50); // Time for read works await port.BaseStream.ReadAsync(buffer, 0, 55); //W

我有一个程序(在WPF应用程序中),它通过线程从COM端口接收信息。 以下是其中的一部分:

static async Task ReceiveData(SerialPort port)
    {
       try
            {
                Thread.Sleep(50);  // Time for read works
                await port.BaseStream.ReadAsync(buffer, 0, 55);  //Wait recive data from Serial Port

                textBox.AppendText("Test");
            }           
    }
出现此问题的原因是,可以在该任务中将其写入文本框。 我有很多其他的文本框在外面,工作得很好。 显示的错误是:

非静态字段、方法或对象需要对象引用 属性“MainWindow.textBox”

如果我将任务更改为public,错误将消失,但当我构建程序时,文本不会显示在框中

我知道这条信息是关于参考的,但这部分似乎没问题,我认为这是关于在公共访问中打开文本框的内容

我更改代码只是为了:

async Task ReceiveData(SerialPort port)
输出时会出现以下错误:

引发异常:WindowsBase.dll中的“System.InvalidOperationException”

错误是:“调用线程无法访问此对象,因为另一个线程拥有它。”

----------由@BrandonKramer解决---------- 使用:


您的错误是因为UI元素(如文本框)只能从UI线程进行修改

要解决此问题,请更改:

textBox.AppendText("Test");


这将导致
textBox.AppendText(“测试”)将在UI线程上执行,而不是在执行任务的后台线程上执行。

您的错误是因为只能从UI线程修改UI元素,如文本框

要解决此问题,请更改:

textBox.AppendText("Test");


这将导致
textBox.AppendText(“测试”)将在UI线程上执行,而不是在执行任务的后台线程上执行。

永远不要使用线程。在异步代码中睡眠,它会破坏整个要点。如果由于某种原因需要延迟,请改用wait Task.delay()。您得到的错误告诉您,您无法从静态方法访问实例成员。static表示该方法在类的所有实例中共享,但textBox是特定于给定对象的属性或字段。如果将static async Task ReceiveData()更改为just async Task ReceiveData(),则该错误将消失。@BrandonKramer我更改并发生了相同的事情,我现在注意到输出时发生的异常,我正在编辑这篇文章。你也不能从创建控件的线程以外的线程修改控件(如文本框)。永远不要使用线程。在异步代码中睡眠,这会破坏整个要点。如果由于某种原因需要延迟,请改用wait Task.delay()。您得到的错误告诉您,您无法从静态方法访问实例成员。static表示该方法在类的所有实例中共享,但textBox是特定于给定对象的属性或字段。如果将static async Task ReceiveData()更改为just async Task ReceiveData(),则该错误将消失。@BrandonKramer我更改并发生了相同的事情,我现在注意到输出时发生的异常,我正在编辑这篇文章。除了创建控件的线程外,您还不能从其他线程修改控件(如文本框)。非常感谢!现在开始了!有一条捷径可以做到这一点吗?想象一下我所有代码中的这个长结构:(对不起,没有比这个短的了。没问题!再次感谢你!@BrandonKramer非常感谢!现在开始了!有一个短方法可以做到这一点吗?想象一下我所有代码中的这个长结构:(对不起,没有比这个短的了。没问题!再次感谢你!@BrandonKramer
Dispatcher.BeginInvoke((Action)(() => textBox.AppendText("Test")));