2015-02-06 67 views
-1

当使用锁的代码块中存在异常时,我遇到问题。我正在读取和写入串行端口,并且有几个不同的线程需要访问相同的串行端口。这是通过锁来管理的。除非串口停止工作,否则我没有任何问题。这可能会发生,因为软件控制射频发射器,偶尔射频可能会导致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 
      { 
      } 

     } 

感谢所有帮助

+4

你为什么把'lock'里面的异常*放在'lock'的外部而不是'lock'的外部?你为什么要从非UI线程或甚至非UI代码与用户进行交互?将业务逻辑与用户界面分开。 – Servy 2015-02-06 18:57:22

+0

锁只应包围需要防止重入的代码。在你的情况,看起来像port.Write是所有需要锁定。 – Will 2015-02-06 18:58:10

+1

@Will'if'也可能需要在'lock'内,假设'portOpened'与另一个线程共享。 – Servy 2015-02-06 18:59:06

回答

0

如果要强制退出应用程序,Application.Exit是不是一个很好的选择,因为它简单地推动对所有线程的消息队列的关闭请求,但不强制任何东西。如果您想不惜任何代价停止应用,请使用Environment.Exit(exitCode),或者可能更好Environment.FailFast,并指定异常,以便将其记录到系统日志中:便于未来调查。

+0

好多了 – Tom 2015-02-07 02:34:43