微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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技术,使其能够安全自动化,检测设备上用户的手指:)

原文地址:https://www.jb51.cc/csharp/98001.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐