C#程序关于某个线程意外退出后引发的程序奔溃

a93952029 2012-11-17 12:21:58
一个项目程序,里面用到了很多线程,程序涉及到跟串口通信,连接投币器,打印机等,但是由于某些未知的原因(我调试了几个月也没找出原因所在,调试环境特殊,程序退出也是不定时,有时一天一次,一天几次,几天一次毫无规律),总是会发生异常退出的情况,现在的程序我能在有可能引发异常的情况都加了捕获异常处理,还额外写了个程序去检测主程序进程是否存在,不存在则启动,但你问题还是无法解决,当程序崩溃时,程序退出了,进程中仍有残留的线程导致无法再次自动启动,程序是运行在像pos机那样的机器上,提供查询,现在想解决这个退出或者启动问题,不知道怎么去做?如果程序退出了,仍有残留线程,该去怎么判断让主线程退出(程序界面很多,子线程不断地被创建和完成,一旦某个线程出了问题,程序崩溃,主线程还在,但是无法返回到主界面中去,因为主界面只有操作完成后才会重新显示出来),问题表达的可能不是很清楚,不知道各位有没有什么好思路,非常感谢!!!
...全文
551 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayun00 2013-01-12
  • 打赏
  • 举报
回复
引用 14 楼 a93952029 的回复:
暂时采用捕捉全局未处理异常,并写入日志处理,并让程序自身重启解决,具体结果只有等运行一段时间才知道了,感觉到时应该能找到问题所在
我也碰到楼上的问题了 ,楼上是自重启是怎么实现的?
niss 2012-11-17
  • 打赏
  • 举报
回复
多线程不好调试,出现问题很麻烦
niss 2012-11-17
  • 打赏
  • 举报
回复
收藏先,哈哈
ycproc 2012-11-17
  • 打赏
  • 举报
回复
一帮情况下要是你自己也无法找到原因和规律的话 可以从日志上面下手。通过写日志分析日志来查找原因。
  • 打赏
  • 举报
回复
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    var msg = e.ExceptionObject.ToString();
    var ss = string.Format("{0}发生系统异常。\r\n{1}\r\n\r\n\r\n", DateTime.Now, msg);
    File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "系统异常.log"), ss);
}
a93952029 2012-11-17
  • 打赏
  • 举报
回复
暂时采用捕捉全局未处理异常,并写入日志处理,并让程序自身重启解决,具体结果只有等运行一段时间才知道了,感觉到时应该能找到问题所在
niss 2012-11-17
  • 打赏
  • 举报
回复
引用 12 楼 a93952029 的回复:
本来程序不是我开发的,后来维护升级修改才全部交给我来做,每天大量数据测试不太现实,首先要人工操作,其次要读取其他的接口,还有就是要使用交警内部的局域网查询数据,不说其他的,就是操作从开始查询到结束,大量测试也不太好操作
别人开发的程序不完善,需要维护和修改,这就是欠债咯,最后擦屁股的人是你,就是替人还债咯......
a93952029 2012-11-17
  • 打赏
  • 举报
回复
本来程序不是我开发的,后来维护升级修改才全部交给我来做,每天大量数据测试不太现实,首先要人工操作,其次要读取其他的接口,还有就是要使用交警内部的局域网查询数据,不说其他的,就是操作从开始查询到结束,大量测试也不太好操作
a93952029 2012-11-17
  • 打赏
  • 举报
回复
引用 8 楼 niss 的回复:
楼主明显是还债的....
此话怎么说...
a93952029 2012-11-17
  • 打赏
  • 举报
回复
引用 7 楼 sp1234 的回复:
引用 6 楼 a93952029 的回复:试了下,捕捉不到子线程中的异常,前几天看到过几篇关于这种方法的,好像对于子线程中的异常不适用 那肯定是你悲催地写了try...catch。 你能先保证你在测试时(使用AppDomain.CurrentDomain.UnhandledException 捕获)代码中没有悲催的try..catch吗?
我特意把try catch去了测试的,测试了4个地方:Program.cs,主窗体,子窗体,子窗体中的线程中,只有处于同一线程才被捕捉到
  • 打赏
  • 举报
回复
另外,程序开发要注重(高强度的)测试驱动,例如对于500个测试用例,每天使用不同(随机)测试数据来执行10万次,并且并发执行各种功能,来驱动程序。 基本上不能靠手工调试来开发。
niss 2012-11-17
  • 打赏
  • 举报
回复
楼主明显是还债的....
  • 打赏
  • 举报
回复
引用 6 楼 a93952029 的回复:
试了下,捕捉不到子线程中的异常,前几天看到过几篇关于这种方法的,好像对于子线程中的异常不适用
那肯定是你悲催地写了try...catch。 你能先保证你在测试时(使用AppDomain.CurrentDomain.UnhandledException 捕获)代码中没有悲催的try..catch吗?
a93952029 2012-11-17
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
C# code?1AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); C# code?123456static void CurrentDomain_UnhandledException(ob……
,试了下,捕捉不到子线程中的异常,前几天看到过几篇关于这种方法的,好像对于子线程中的异常不适用

110,559

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧