C# 这段代码有什么错误,即使在使用新线程后,也会导致UI挂起?
我正试图编写一个程序,使用c#windows窗体应用程序读取串行端口。我刚刚开始学习线程和任务等。因此我对此有点困惑。因此,即使阅读了一些文档,我仍然不知道为什么以下代码会导致UI挂起?因此,这个代码怎么了?你有什么建议吗?谢谢 有一个名为txtRead的richtextbox,它应该显示在单击名为btnReadBegin的按钮后从串行端口获取的数据。当串行端口发送数据时,richtextbox会频繁更新,但应用程序的其余部分会挂起C# 这段代码有什么错误,即使在使用新线程后,也会导致UI挂起?,c#,winforms,user-interface,freeze,C#,Winforms,User Interface,Freeze,我正试图编写一个程序,使用c#windows窗体应用程序读取串行端口。我刚刚开始学习线程和任务等。因此我对此有点困惑。因此,即使阅读了一些文档,我仍然不知道为什么以下代码会导致UI挂起?因此,这个代码怎么了?你有什么建议吗?谢谢 有一个名为txtRead的richtextbox,它应该显示在单击名为btnReadBegin的按钮后从串行端口获取的数据。当串行端口发送数据时,richtextbox会频繁更新,但应用程序的其余部分会挂起 SerialPort srlPort = new Seria
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放入创建的线程中,并将结果发送到BeginInvoketxtRead.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具有响应性,您需要通过在另一个线程中移动重/阻塞内容来限制其工作负载。