C# 在WPF应用程序中的线程(任务)中的文本框上写入
我有一个程序(在WPF应用程序中),它通过线程从COM端口接收信息。 以下是其中的一部分: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
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")));