c# – SerialPort.Close()问题 – 无法使用taskmanager关闭应用程序!

这是一个主要问题 – 我在应用程序中使用串行端口,然后通过打开然后再次关闭端口来轮询连接设备的状态.

如果设备出现故障,有时候SerialPort.Close() – 方法会返回,这实际上是一个显示停止.

最糟糕的是,即使使用taskmanager关闭应用程序失败,它也不起作用(或者是偶然禁止的).

连接的设备是一个模拟COM3的POS打印机(USB),它是一个Epson TM-T88IV(一个非常好的型号,顺便说一句).

你们中有谁有经验吗?

解决方法

不建议反复打开和关闭端口.有关SerialPort.Close(),请查看MSDN Library文章中的“备注”部分.有一个后台线程需要在再次打开端口之前关闭,这需要时间.时间量是不可预测的.

如果DataReceived事件处理程序当前正在运行,则Close()方法很容易死锁.获取死锁的最典型方法是在事件处理程序中调用Control.Invoke().确保在阻止或需要线程上下文切换的事件处理程序中不使用任何代码.使用BeginInvoke()很好.

无法终止程序是由串行端口设备驱动程序中的问题引起的.启动Taskmgr.exe,Process选项卡,View Select Columns并勾选“Handles”.如果在杀死程序后,您看到Handles列显示1,则串行端口驱动程序将挂起到未完成的I / O请求.在退出所有内核模式线程之前,该进程无法终止.

除了希望更新驱动程序或切换到其他供应商之外,您无法对该特定问题做些什么.特别是USB串口仿真器因糟糕的设备驱动程序而臭名昭着.你把它从停车场取出并用你的车多次运行就可以摆脱这样的麻烦制造者.

USB仿真器的另一个典型问题是它们在使用时很容易断开连接.这与Windows正在写入时将闪存驱动器从插槽中抽出一样有效.这也是一个让设备驱动程序挂起的好方法当4.0版本之前的.NET版本在后台线程中遭受心脏病发作时,设备会突然消失.升级之后,连接器旁边的一个小符号显示“在使用时不要断开连接!”是一个实用的解决方法.无论如何他们会在几次之后对它感到厌倦.

Fwiw,这就是为什么存在“安全删除硬件”托盘图标的原因.你会得到一个坚实的“不要做!”只要您的程序正在使用该端口,就会出错.但是,当然,操作系统无法让用户真正使用它. Apple拥有a patent技术,使其能够安全自动化,检测设备上用户的手指:)

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...