【问题标题】:How to catch I/O exception如何捕获 I/O 异常
【发布时间】:2013-10-03 16:36:24
【问题描述】:

我已经解决这个问题很多天了,但我被困在其中,无法弄清楚。问题是当我关闭端口时,我得到了这个著名的错误

The I/O operation has been aborted because of either a thread exit or an application request

我的代码是这样的

 private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {


            try
            {
                port.ReadExisting();
                port.DiscardInBuffer();         
                if (port.IsOpen)
                {

                    port.Close();
                }

                Window1 caster = new Window1(this);
                caster.ShowDialog();
            }
            catch (IOException)
            {

            }

port.close() 被执行时,我得到了上述错误。如果我取消订阅数据接收事件,即使这样也会发生此错误并且不会被 catch 语句捕获。
我搜索了它并找到了许多示例,那里提供的所有解决方案都已尝试过,但每次使用应用程序时都让我很烦。
有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您确定是引发了 IOException 吗?也许尝试捕获异常,如果确实命中了该捕获,则使用调试器查找类型。
  • 我之前曾多次尝试过 Exception 而不是 IOException 但结果相同。然后我认为这可能是 IOException 这就是我问这个问题的原因。
  • 有趣。异常应该包括所有异常,这意味着您根本没有遇到异常。查看消息,我想知道错误是否在此代码之外(之后)。在线程完成后,与 I/O 操作类似的东西仍然处于活动状态(或者是“打开”的东西,或者操作是异步的)。然后当你的线程在你的 try 语句之后完成时,系统会注意到一个不再存在的线程的 I/O 操作挂起,取消操作,并给你执行。但是您的 Try 早已不复存在,无法捕捉到它。
  • 如果不是在捕获中,您会在哪里得到该错误?尝试全局异常处理程序。 msdn.microsoft.com/en-us/library/… 并且可能打开非托管代码的调试
  • 我在关闭端口的地方得到了这个错误。即使不起作用,我也尝试过全局异常。唉

标签: .net io serial-port


【解决方案1】:

是的,这是一个无法捕获的异常。它在 SerialPort 类启动的工作线程中引发,以便它可以触发 DataReceived、ErrorReceived 和 PinChanged 事件。自 .NET 2.0 起,工作线程中未处理的异常会终止程序。在this blog post 中的提示#4 中介绍了如何处理这种行为。我不会在这里重复它,因为这是你永远不应该做的事情,只有纯粹的绝望是一个足够好的理由去考虑它。

根本原因是调用 Close() 方法时设备驱动程序返回的意外 Windows 错误代码。司机应该只是遵守要求,而不是抱怨它。但是,对于模拟 USB 或蓝牙设备的串行端口的驱动程序,这将变得难以实现。总的来说,它们的质量相当低。

当您对设备进行不明智的操作时,您特别有可能引发此类意外错误代码。一般来说,USB 设备的一个非常常见的陷阱,当您的程序行为不端时,它们不会给您任何合理的方法来做一些合理的事情。所以你挠了挠头,耸了耸肩,然后拉了连接器。现在你有两个问题。一些设备驱动程序处理得非常糟糕,他们只是让设备消失。即使 SerialPort 类上打开了一个句柄。这不是一个好的结局,委婉地说,当你调用 Close() 时肯定会爆炸。

像在代码中那样关闭端口也是非常不可取的,MSDN 文章 SerialPort.Close() 对此提出了警告。该工作线程需要一段时间才能退出,在这种情况发生之前您无法再次打开端口。这需要不可预知的秒数才能发生。这里的智慧是只在您启动程序时打开端口,并且只在您退出时(或从不)关闭它。从来没有一个有效的选项,尽管你可能会注意到如果核心原因没有得到解决,终结器线程会在程序退出时爆炸。

因此,这里的常见建议是寻找驱动程序更新,切勿在您使用设备时弄乱设备,将设备带到停车场并与您的汽车一起运行几次。还有技巧 #4。

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2011-12-29
    • 1970-01-01
    • 2017-08-22
    相关资源
    最近更新 更多