代码之家  ›  专栏  ›  技术社区  ›  Turing Complete

串行端口。关闭()问题-无法使用taskmanager关闭应用程序!

  •  6
  • Turing Complete  · 技术社区  · 15 年前

    如果设备出现故障,有时串行端口。关闭()-方法永远不会返回,这确实是一个显示停止。

    最糟糕的是,即使使用taskmanager关闭应用程序失败,它也无法工作(或者是被禁止的,这是偶然的)。

    连接的设备是一个POS打印机(USB),它模拟COM3,这是一个爱普生TM-T88IV(一个非常好的模式,顺便说一句)。

    你们中有人有过这样的经历吗?

    6 回复  |  直到 15 年前
        1
  •  11
  •   Hans Passant    11 年前

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

    如果DataReceived事件处理程序当前正在运行,Close()方法很容易死锁。获取死锁的最典型方法是调用控制。调用()在事件处理程序中。确保事件处理程序中没有使用任何阻止或需要线程上下文切换的代码。使用BeginInvoke()就可以了。

    无法终止程序是由串行端口设备驱动程序中的问题引起的。开始Taskmgr.exe,进程选项卡,视图+选择列并勾选“句柄”。如果在终止程序后,您看到Handles列显示1,那么串行端口驱动程序将挂起一个未完成的I/O请求。在退出所有内核模式线程之前,进程无法终止。

    对于这个特殊的问题,除了希望有一个驱动程序更新或切换到另一个供应商之外,你几乎无能为力。尤其是USB串行端口模拟器,因为其设备驱动程序糟糕而臭名昭著。你把这样的麻烦制造者从停车场拿出来,用你的车把它碾了好几次,这样你就摆脱了它。

    Fwiw,这就是为什么“安全删除硬件”托盘图标存在的原因。你会得到一个坚实的“不要这样做!”只要您的程序使用了端口,就会出错。当然,操作系统无法让用户真正使用它。苹果公司 a patent

        2
  •  2
  •   dbasnett    15 年前

    在.NET4.0之前,USB到串行端口设备(程序/系统崩溃等)可能会出现很多问题。通过在端口处于活动状态时拔出USB适配器,可以很容易地测试错误。

        3
  •  2
  •   Gabe Timothy Khouri    15 年前

    虽然有时 SerialPort.Close 方法死锁,这不应阻止任务管理器终止进程。如果不能终止进程,这几乎可以肯定是由于USB串行驱动程序中的一个bug造成的。不幸的是,您的选择很可能是:

    • 不轮询设备状态
    • 让供应商修复错误
    • 解决这个问题的方法是找出一种不用访问串行端口就可以轮询设备状态的方法
    • 通过其他方法访问设备(可能是直接的USB操作)来解决问题
        4
  •  2
  •   or levy    14 年前

    不可能?

    现在我自己试试

        5
  •  1
  •   Giorgi    15 年前

    用什么 BackGround 线程来轮询设备,以便它不会阻止您的应用程序退出?