gpt4 book ai didi

c# - 在 WPF 应用程序的线程 (TASK) 中写入文本框

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:28 24 4
gpt4 key购买 nike

我有一个程序(在 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");
}
}

出现这个问题是因为正好在这个任务中可以在文本框中写入。我在外面还有很多其他文本框,并且工作得很好。显示的错误是:

An object reference is required for the non-static field, method, or property 'MainWindow.textBox'

如果我为公共(public)更改任务,错误就会消失,但是当我构建程序时,文本不会出现在框中。

我知道消息是关于引用的,但看起来这部分没问题,我认为这是关于将文本框公开访问的内容。

我更改代码只是为了:

async Task ReceiveData(SerialPort port)

输出时出现以下错误:

Exception thrown: 'System.InvalidOperationException' in WindowsBase.dll

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

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

 Dispatcher.BeginInvoke((Action)(() => textBox.AppendText("Test")));

最佳答案

您的错误是因为 UI 元素(例如 TextBox)只能从 UI 线程修改。

为了解决这个问题,改变:

textBox.AppendText("Test");

Dispatcher.BeginInvoke((Action)(() => textBox.AppendText("Test")));

这将导致 textBox.AppendText("Test"); 在 UI 线程上执行,而不是在您的任务正在执行的后台线程上执行。

关于c# - 在 WPF 应用程序的线程 (TASK) 中写入文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42539700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com