c# - SerialPort.Close() 问题 - 无法使用任务管理器关闭应用程序!

标签 c# crash timeout serial-port

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

如果设备出现故障,有时 SerialPort.Close() - 方法永远不会返回,这确实是一个表演障碍。

最糟糕的是,即使使用任务管理器关闭应用程序失败,它也不起作用(或者偶然被禁止)。

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

你们中有人有这方面的经验吗?

最佳答案

不建议反复打开和关闭端口。检查 SerialPort.Close() 的 MSDN 库文章中的备注部分。有一个后台线程需要关闭才能再次打开端口,这需要时间。时间量是不可预测的。

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

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

除了希望更新驱动程序或切换到其他供应商之外,您对这个特定问题无能为力。特别是 USB 串行端口仿真器因设备驱动程序糟糕而臭名昭著。你可以通过将它带出 parking 场并用你的汽车碾压它几次来摆脱这样的麻烦制造者。

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

Fwiw,否则这就是“安全删除硬件”托盘图标存在的原因。你会得到一个坚定的“不要这样做!”只要您的程序有正在使用的端口,就会出错。但当然,操作系统无力让用户实际使用它。苹果有a patent一种使其故障安全的技术,检测设备上的用户手指:)

关于c# - SerialPort.Close() 问题 - 无法使用任务管理器关闭应用程序!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523812/

相关文章:

c# - Elasticsearch :从JSON到NEST的查询,没有重复项

java - TextView.setText()使我的应用程序在HTC One和Bluestacks上崩溃

javascript - NightWatch/JavaScript 中的超时/ sleep

c# - C# 上的 MySQL 连接超时

jquery - 持续运行 ajax 请求的更好方法?

javascript - 如何将 JSON 对象从 JavaScript 发送到 C# 服务器?

c# - 将数据存储在数组、对象、结构、列表或类中。 C#

c# - Microsoft.ApplicationInsights 错误 : InstrumentationKey cannot be empty

ios - iPhone 和 Ipad 崩溃 :reason: '*** setObjectForKey: object cannot be nil (key: objectid)'

ios - tableView 在超过 16 个项目时崩溃