我有一个调用SerialPort.Open()的应用程序...... 这很好用,通过端口读/写数据。 但是,如果用户决定通过TaskManager终止应用程序,应用程序将关闭,而不会调用我的析构函数调用SerialPort.Close()。
反过来(仅在某些情况下)会导致以下错误:
拒绝访问端口“COM2”。
重新启动应用程序时会发生这种情况。 我已经阅读了足够的帖子,知道如果正确调用了.Close(),就不会发生这种情况。 到目前为止,我已经通过一个计时器来处理这个问题,该计时器重新尝试.Open()..最终成功(这是我认为它在大部分时间都有效)。
我的问题是:
是否有DLLImport方法允许我释放Comm端口资源?
答案 0 :(得分:2)
我擦了我的水晶球,它显示你正在使用一个模拟串口的USB驱动程序,用户认为杀死这个过程是一个好主意,因为她把USB连接器从插座中拉出来并且她正在运行Vista之前版本的Windows。
大概是该列表中的任何两个组合。是的,不起作用,当内核线程正在完成无法完成的I / O请求时,您无法终止进程。使用View + Select Columns并勾选Handles时,可以从TaskMgr.exe中判断。这个过程将僵尸打开一个手柄。在驾驶员真正放手之前不会关闭。不会发生,USB驱动程序就是这样。
再次启动程序会炸弹,该进程的第一个实例仍然打开了端口。访问被拒绝。
告诉用户将手从连接器上移开。或者从不同的制造商处购买另一个。您可以通过在程序中添加“安全删除硬件”菜单选项来提供帮助。这称为SerialPort.Close()方法。呼叫睡眠(2500)并显示一个消息框,可以拔掉它。