在锁定的代码块中尝试捕获异常
Try Catch exception in a locked block of code
当使用锁的代码块中出现异常时,我遇到了一个问题。我正在读取和写入串口,有几个不同的线程需要访问同一个串口。这是由锁管理的。我没有任何问题,除非串口停止工作。发生这种情况是因为软件控制着 RF 发射器,有时 rf 会导致 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
{
}
}
感谢您的帮助
如果你想强制退出应用程序,Application.Exit
不是一个好的选择,因为它只是将关闭请求推送到所有线程的消息队列,但不会强制执行任何操作。如果您想不惜一切代价停止应用程序,请使用 Environment.Exit(exitCode), or may be even better Environment.FailFast,并指定例外情况,以便将其记录到系统日志中:方便以后的调查。
当使用锁的代码块中出现异常时,我遇到了一个问题。我正在读取和写入串口,有几个不同的线程需要访问同一个串口。这是由锁管理的。我没有任何问题,除非串口停止工作。发生这种情况是因为软件控制着 RF 发射器,有时 rf 会导致 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
{
}
}
感谢您的帮助
如果你想强制退出应用程序,Application.Exit
不是一个好的选择,因为它只是将关闭请求推送到所有线程的消息队列,但不会强制执行任何操作。如果您想不惜一切代价停止应用程序,请使用 Environment.Exit(exitCode), or may be even better Environment.FailFast,并指定例外情况,以便将其记录到系统日志中:方便以后的调查。