我已经在这个问题上工作了很多天,但我陷入其中并且无法弄明白。问题是,当我关闭端口时,我得到了这个着名的错误
The I/O operation has been aborted because of either a thread exit or an application request
我的代码就像这样
private void MenuItem_Click_1(object sender, RoutedEventArgs e)
{
try
{
port.ReadExisting();
port.DiscardInBuffer();
if (port.IsOpen)
{
port.Close();
}
Window1 caster = new Window1(this);
caster.ShowDialog();
}
catch (IOException)
{
}
执行port.close()
时,我得到上述错误。如果我取消订阅收到的数据事件,即使这样也会发生此错误,并且不会被catch语句捕获
我搜索了它并找到了很多例子,所有提供的解决方案都尝试过,但每次我使用app时都会让我感到烦恼。
任何人都可以帮助我解决这个问题吗?
答案 0 :(得分:4)
是的,这是一个无法捕捉的例外。它在工作线程中引发,SerialPort类启动,以便它可以触发DataReceived,ErrorReceived和PinChanged事件。工作线程中未处理的异常自.NET 2.0起终止程序。 this blog post中的提示#4涵盖了处理此行为的问题。我不会在这里重复一遍,因为这是你永远不应该做的事情,只有纯粹的绝望才是考虑它的充分理由。
根本原因是在调用Close()方法时由设备驱动程序返回的意外Windows错误代码。司机应该遵守请求而不是婊子。但是那种模拟USB或蓝牙设备串行端口的驱动程序很难实现。它们的质量一般都很低。
当您使用设备进行不明智的操作时,您特别容易引发这种意外的错误代码。一般来说,USB设备是一个非常常见的陷阱,当程序行为不当时,它们无法让您做任何合理的事情。所以你挠挠头,耸耸肩并拉动连接器。现在你有两个问题。一些设备驱动程序处理这个问题非常糟糕,它们只会让设备消失。尽管SerialPort类上有一个句柄。温和地说,当你打电话给Close()时,这肯定会爆炸。
像在代码中那样关闭端口也是非常不可取的,这是针对SerialPort.Close()的MSDN文章所警告的。该工作线程需要一段时间才能退出,在发生这种情况之前,您无法再次打开该端口。发生这种情况需要不可预测的秒数。这里的智慧是只在您启动程序时打开端口,并且在退出时只会(或从不)关闭它。从来没有一个有效的选项,尽管你可能会注意到,如果核心原因没有解决,终结器线程会在程序退出时发生爆炸。
因此,这里的常见建议是寻找驱动程序更新,从不在使用设备时弄乱设备,将设备带到停车场并将其与汽车一起运行几次。这个提示#4。