这个问题是关于为什么当我通过串口接收内容时微软不允许我对程序界面进行更改。
我是一名初级工程师,在我的工作中,一位高级程序员向我解释说,当Microsoft打开一个新的线程,其中包含来自串口的收入信息时,它不允许您在界面中进行更改,我需要使用BeginInvoke(...)函数创建一个新线程来完成它。
我所拥有的是一个界面,其中有一个Console按钮,当我按下控制台按钮时,会打开一个RichtextBox。我的程序可以从需要在RichtextBox中打印的串口文本接收,但没有出现。
我的问题是,当我使用自己创建的线程通过串口接收内容时,为什么Microsoft不允许我在richtextbox中打印?我不明白为什么我需要创建一个新的线程来做到这一点。微软给出了具体原因吗?
我希望你能理解我,解释它有点困难嘿嘿。
谢谢!
答案 0 :(得分:1)
根本不需要创建新线程。所有必要的线程都已存在。
实际发生的是,当SerialPort
在辅助线程上引发其DataReceived
事件时,所有UI元素都归UI线程所有。这非常有意义,因为您不希望从COM端口接收数据以使您的UI冻结。由于UI的更改只能在UI线程上进行,因此您无法直接从DataReceived
事件处理程序执行此操作。您必须封送对UI线程的方法调用才能执行此操作。一旦你知道如何,这很简单。
您没有创建任何新主题。您在一个现有线程上接收数据,然后在另一个现有线程上使用。