【问题标题】:Try Catch exception in a locked block of code尝试在锁定的代码块中捕获异常
【发布时间】:2015-02-06 18:56:06
【问题描述】:

当使用锁的代码块中出现异常时,我遇到了问题。我正在读取和写入串行端口,并且有几个不同的线程需要访问同一个串行端口。这是由锁管理的。除非串行端口停止工作,否则我没有任何问题。发生这种情况的原因是软件控制射频发射器,有时射频会导致 USB 转串口停止工作。如果您随后尝试写入端口,您将收到写入超时。我尝试从 try-catch 异常处理程序中处理这个问题。但是,该程序此时会硬锁定并且必须终止任务。我不确定这是否来自异常或我试图显示的消息框,因为它可能来自后台线程。代码如下:

        lock (_object)
        {
            try
            {
                if (portOpened)
                {
                    port.Write(data);
                }

                else
                {
                    MessageBox.Show("The radio is not connected. Please select a ComPort in the settings dialog");

                }
            }

            catch (Exception x) //this will capture a write exception.
            {
                MessageBox.Show("The program is unable to write to the serial port. Select OK to close the program";

                Application.Exit();

            }

            finally
            {
            }

        }

感谢您的帮助

【问题讨论】:

  • 你为什么要处理lockinside 异常而不是lockoutside?为什么你要从非 UI 线程甚至非 UI 代码与用户交互呢?将业务逻辑与用户界面分离。
  • 锁应该只包围需要防止重入的代码。在你的情况下,看起来 port.Write 是所有需要锁定的。
  • @Will if 可能也需要在lock 中,假设portOpened 与另一个线程共享。
  • @servy 所以你说把 try 放在锁之外,然后 catch 可以处理异常。然后我应该使用调用,因为其他后台工作人员或用户界面可以访问此线程。
  • 空的finally 子句有什么意义?更重要的是,您的实际问题是什么?您得到了一个(我认为)解决“锁定困难”问题的答案。但这真的是您需要帮助的全部吗?还是这个问题不止于此?你的问题没有提到Invoke()BackgroundWorker,但你之前的评论暗示你需要一些帮助。

标签: c# multithreading exception locking


【解决方案1】:

如果你想强制退出应用程序,Application.Exit 不是一个好的选择,因为它只是将 Close 请求推送到所有线程的消息队列上,但不会强制执行任何操作。如果您想不惜一切代价停止应用程序,请使用Environment.Exit(exitCode),或者更好的是Environment.FailFast,并指定例外,以便将其记录到系统日志中:方便以后调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-12-05
    • 2017-06-18
    相关资源
    最近更新 更多