C# 这段代码有什么错误,即使在使用新线程后,也会导致UI挂起?

C# 这段代码有什么错误,即使在使用新线程后,也会导致UI挂起?,c#,winforms,user-interface,freeze,C#,Winforms,User Interface,Freeze,我正试图编写一个程序,使用c#windows窗体应用程序读取串行端口。我刚刚开始学习线程和任务等。因此我对此有点困惑。因此,即使阅读了一些文档,我仍然不知道为什么以下代码会导致UI挂起?因此,这个代码怎么了?你有什么建议吗?谢谢 有一个名为txtRead的richtextbox,它应该显示在单击名为btnReadBegin的按钮后从串行端口获取的数据。当串行端口发送数据时,richtextbox会频繁更新,但应用程序的其余部分会挂起 SerialPort srlPort = new Seria

我正试图编写一个程序,使用c#windows窗体应用程序读取串行端口。我刚刚开始学习线程和任务等。因此我对此有点困惑。因此,即使阅读了一些文档,我仍然不知道为什么以下代码会导致UI挂起?因此,这个代码怎么了?你有什么建议吗?谢谢

有一个名为txtRead的richtextbox,它应该显示在单击名为btnReadBegin的按钮后从串行端口获取的数据。当串行端口发送数据时,richtextbox会频繁更新,但应用程序的其余部分会挂起

SerialPort srlPort = new 
SerialPort("COM6",9600,Parity.None,8,StopBits.One); 
delegate void mydel();
bool checkWhile = true;
private void BtnReadBegin_Click(object sender, EventArgs e)
        {
            srlPort.Open();
            new Thread(() =>
            {
                txtRead.BeginInvoke(new mydel(ReadingSerialPortMethod));
            }).Start();
        }
        void ReadingSerialPortMethod()
        {
            while (checkWhile)
            {
                txtRead.Text += 
Convert.ToString(Convert.ToChar(srlPort.ReadChar()));
            }
        }

这是因为ui线程中有一个无限循环。尝试将循环和串行ReadChar放入创建的线程中,并将结果发送到BeginInvoke
txtRead.BeginInvoke(()=>txtRead.Text+=readedChar)我尝试了以下代码,但问题仍然存在:private void BtnReadBegin_Click(对象发送者,事件参数e){srlPort.Open();new Thread(()=>{while(checkWhile){txtRead.BeginInvoke((操作)()=>txtRead.Text+=Convert.ToString(Convert.ToChar(srlPort.ReadChar()));}}.Start();}您需要在调用之前调用
ReadChar
BeginInvoke@Kalten它正在工作。但是你能告诉我为什么必须在启动InVoke之前调用ReadChar吗?因为这个方法正在阻塞当前线程。你需要考虑什么在哪里、什么时候运行。您有2个线程、UI和一个自定义线程。如果你想让UI具有响应性,你需要通过在另一个线程中移动重/阻塞的内容来限制它的工作负载。这是因为你在UI线程中有一个无限循环。尝试将循环和串行ReadChar放入创建的线程中,并将结果发送到BeginInvoke
txtRead.BeginInvoke(()=>txtRead.Text+=readedChar)我尝试了以下代码,但问题仍然存在:private void BtnReadBegin_Click(对象发送者,事件参数e){srlPort.Open();new Thread(()=>{while(checkWhile){txtRead.BeginInvoke((操作)()=>txtRead.Text+=Convert.ToString(Convert.ToChar(srlPort.ReadChar()));}}.Start();}您需要在调用之前调用
ReadChar
BeginInvoke@Kalten它正在工作。但是你能告诉我为什么必须在启动InVoke之前调用ReadChar吗?因为这个方法正在阻塞当前线程。你需要考虑什么在哪里、什么时候运行。您有2个线程、UI和一个自定义线程。如果您想让UI具有响应性,您需要通过在另一个线程中移动重/阻塞内容来限制其工作负载。