gpt4 book ai didi

c# - 如何在关闭前等待串口清空

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

我有一个串行端口从嵌入式设备异步接收数据。用户可以选择随时终止与端口的连接,但这意味着如果用户在传输过程中断开连接,我会得到一个异常(有时程序只是在 myPort.Close() 上停止) .有没有办法可以添加“等到空”命令?像下面这样的东西?

private void tsDisconnect_Click(object sender, EventArgs e)
{
try
{
while(myPort.BytesToRead > 0)
{//wait here}
}
myPort.Close();
}

最佳答案

等待并不能解决因调用 Close() 而导致的死锁,您需要解决核心问题。它几乎总是由您的 DataReceived 事件处理程序中的代码引起的。我们看不到它,但一个非常常见的错误是使用 Control.Invoke() 或 Dispatcher.Invoke()。

在事件处理程序返回之前,串行端口无法关闭。但它无法返回,因为它卡在了 Invoke() 调用中。无法完成,因为您的 UI 线程很忙,它卡在 Close() 调用中。或者正在等待 BytesToRead 变为 0,这是您正在寻求的解决方案。也不起作用,您的 DataReceived 事件处理程序被卡住并且不再读取。死锁城。

您需要修复该代码并改用 BeginInvoke()。这是一个非阻塞调用,它不会导致死锁。

死锁还有其他可能的原因。易于诊断,您有很多时间来调试它 :) 使用 Debug + Break All,然后使用 Debug + Windows + Threads。双击主线程并查看其调用堆栈以查看 UI 线程正在做什么。

关于c# - 如何在关闭前等待串口清空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17660421/

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