求助防崩溃方案(只能给200分,有好的方案另开贴加分)

showjim 2010-11-17 10:26:22
在做一个WCF项目时遇到一个P2P客户端程序问题,求解决方案。崩溃的原因应该是底层Socket连接服务器不响应,客户端超时引起的。
1、所有可能出错的地方都用了try+catch,这个错误无法捕获。
2、Application.ThreadException 也没有捕获到线程错误。
3、AppDomain.CurrentDomain.UnhandledException 也没有捕获到这个错误。
4、新开AppDomain动态加载dll,也未能逃脱整个应用程序崩溃的命运。

求解决方案,只要能够屏蔽该异常就行,也就是不造成整个应用程序崩溃;要求不能用多进程的解决方案。
...全文
642 48 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
萨拉嘿 2010-11-26
  • 打赏
  • 举报
回复
你所指的崩溃时时程序异常关闭还是说没响应? 崩溃的话注意异常处理 处理再出现异常的话就game over了 再个注意下WCF传输大小有限制 外网传输MTU有限制会接收不到信息
showjim 2010-11-26
  • 打赏
  • 举报
回复
本以为无满意答案也可以分配分数,谁知竟是不给分,所以重新开贴补分,请楼上各位到下面这个贴子去接分,麻烦各位了。
http://topic.csdn.net/u/20101126/12/0966d970-9be2-4c4e-85ca-0f0f77b0134f.html
showjim 2010-11-26
  • 打赏
  • 举报
回复
看来是找不到答案的,谢谢楼上各位回贴的朋友以及关注此贴的朋友。
Microblue 2010-11-26
  • 打赏
  • 举报
回复
顶一个~~~~
红鱼Ascend 2010-11-26
  • 打赏
  • 举报
回复
可否考虑在客户端底层模拟一个失去响应的socket接口,先排除是客户端程序逻辑本身保护不足的问题呢?
如果能够排除,则查找问题代码,如果不能排除,则寻找系统关于socket处理的相关资料
萨拉嘿 2010-11-25
  • 打赏
  • 举报
回复
= = socket不响应是因为操作是你服务器端发起的吧 看看你有响应地操作是否都是客户端主动发起的。。。我认为是外网NAT问题 最简单的实验就是你将你的客户端所在的路由开放指定地址 就会有响应 处理办法建议首先保证请求的最初发起者为客户端 随后定时发送心跳包 我当初写过个项目就是用WCF通讯的 结果拿到外网发现服务器在发送的数据客户端根本接收不到
showjim 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lijun84 的回复:]
捕获到了又如何? 多数时候恢复一个异常的成本高到无法承受。

首先看样子你们的解决方案不可能对程序大规模改动。那么一下3种方式试试吧。

1, debug模式下运行server。看调用栈定位问题。

2, moniter多进程解决方案。

3, cluster方案
[/Quote]
P2P本就不是稳定的东西,不需要恢复什么,只需要能够忽略就可以了,因为调用之前都有状态检查。
P2P就是为了尽量减少服务器的参与,cluster是不可能去做的。如果WCF的P2P服务器只能承受百来个并发,这样的话将来也许只能抛弃WCF,直接用C++做类似于KAD的网络了。
多进程只是备用方案,看样子很可能是最终方案了。


网页更新监视工具
实时js调试工具(IE)
Return门徒 2010-11-25
  • 打赏
  • 举报
回复
应该是系统资源占用过多,看下是不是有些资源用完后没有释放掉
如果没有,程序的逻辑也可能优化下我能想到的就这些了~!
showjim 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 mooniscrazy 的回复:]
这三种方法,都是.net可以捕获的异常才会生效。如果是非托管组件中发生了异常,它们是捕获不到的。
奔溃时的错误信息是什么?直接退出,还是被操作系统关闭?或者是占用资源太多导致系统失去响应?这些信息要提供出来才能进一步分析。
1.如果是直接退出,那么有可能是在主线程以外的线程中发生异常没有处理引起的。在所有的线程的第一个函数入口加上try catch,可以捕获这类错误。然后在main函数加上try catch,就可以捕获所有的主线程的错误。只要是托管组件中发生的异常,这样一定可以捕获。
2.如果1不生效,那么就是非托管代码发生异常了。微软的类库一般会提供异常信息。所以,应该会是项目中的第三方组件比如com组件,外部的dll的函数(通过DllImport导入的c函数)发生的错误。这类错误,看看能否在调用之前加一些检查来解决。调用之后估计就挂了。
3.如果1和2都不生效,那就只能用多进程的方案了。没有其他办法。

4.如果是占用资源太多,导致系统失去响应,那么可以检查下线程数量和socket句柄的数量,这类不算是Exception,是程序逻辑的问题。可能是连接Block之后,创建了大量的线程或者连接,导致资源占用过多。对这种情况终止执行就可以了。
[/Quote]
谢谢您的回复。
不是系统失去响应,退出是操作系统关闭的,可以确认异常不是.net层产生的,调试崩溃也得不到详细信息。
所谓的第三方组件是WCF对操作系统底层的调用,在调用之前都有检查状态是否可用。
我现在的测试是在一台客户机上同时开几十个客户端进程,CPU利用率很低,内存虽然用得多但绝不会达到虚拟内存不足的情况,至于socket句柄数量应该不会造成崩溃吧。
需要说明的是真实环境中一台客户机只会开一个客户端进程,因为测试环境存在崩溃的情况,所以害怕真实环境也出现崩溃问题。


网页更新监视工具
实时js调试工具(IE)
showjim 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 oonukeoo 的回复:]
= = socket不响应是因为操作是你服务器端发起的吧 看看你有响应地操作是否都是客户端主动发起的。。。我认为是外网NAT问题 最简单的实验就是你将你的客户端所在的路由开放指定地址 就会有响应 处理办法建议首先保证请求的最初发起者为客户端 随后定时发送心跳包 我当初写过个项目就是用WCF通讯的 结果拿到外网发现服务器在发送的数据客户端根本接收不到
[/Quote]
谢谢你的回复,程序不存在通讯问题。
好像是在服务器遇到并发数比较大的时候,会抛弃一些客户端,被抛弃的客户端可能崩溃,没有崩溃的进程要么是正常的,要么会恢复正常。
Qinyoulan108 2010-11-25
  • 打赏
  • 举报
回复
强烈关注,友情帮顶!
a_110120 2010-11-25
  • 打赏
  • 举报
回复
高山仰止。
porschev 2010-11-25
  • 打赏
  • 举报
回复
up一下。。。。。
福来哥 2010-11-25
  • 打赏
  • 举报
回复
建议楼主对非托管资源建个测试项目。多试几个临界值。
sunzhi523 2010-11-24
  • 打赏
  • 举报
回复
以后多多交流 哦。。。
showjim 2010-11-24
  • 打赏
  • 举报
回复
最后顶一次,下次来的时候再结贴


网页更新监控工具
实时js调试工具(IE)
wolftop 2010-11-24
  • 打赏
  • 举报
回复
捕获到了又如何? 多数时候恢复一个异常的成本高到无法承受。

首先看样子你们的解决方案不可能对程序大规模改动。那么一下3种方式试试吧。

1, debug模式下运行server。看调用栈定位问题。

2, moniter多进程解决方案。

3, cluster方案
mooniscrazy 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用楼主 sbwwkmyd 的回复:]
在做一个WCF项目时遇到一个P2P客户端程序问题,求解决方案。崩溃的原因应该是底层Socket连接服务器不响应,客户端超时引起的。
1、所有可能出错的地方都用了try+catch,这个错误无法捕获。
2、Application.ThreadException 也没有捕获到线程错误。
3、AppDomain.CurrentDomain.UnhandledException 也没有捕获到这个错误……
[/Quote]
这三种方法,都是.net可以捕获的异常才会生效。如果是非托管组件中发生了异常,它们是捕获不到的。
奔溃时的错误信息是什么?直接退出,还是被操作系统关闭?或者是占用资源太多导致系统失去响应?这些信息要提供出来才能进一步分析。
1.如果是直接退出,那么有可能是在主线程以外的线程中发生异常没有处理引起的。在所有的线程的第一个函数入口加上try catch,可以捕获这类错误。然后在main函数加上try catch,就可以捕获所有的主线程的错误。只要是托管组件中发生的异常,这样一定可以捕获。
2.如果1不生效,那么就是非托管代码发生异常了。微软的类库一般会提供异常信息。所以,应该会是项目中的第三方组件比如com组件,外部的dll的函数(通过DllImport导入的c函数)发生的错误。这类错误,看看能否在调用之前加一些检查来解决。调用之后估计就挂了。
3.如果1和2都不生效,那就只能用多进程的方案了。没有其他办法。

4.如果是占用资源太多,导致系统失去响应,那么可以检查下线程数量和socket句柄的数量,这类不算是Exception,是程序逻辑的问题。可能是连接Block之后,创建了大量的线程或者连接,导致资源占用过多。对这种情况终止执行就可以了。
zhushoudong 2010-11-24
  • 打赏
  • 举报
回复
七楼 所说的就是看门狗吧,这个都有载,也是一种方法吧
showjim 2010-11-22
  • 打赏
  • 举报
回复
自己再顶起来,希望有经验的兄弟能够看到
加载更多回复(21)

111,093

社区成员

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

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

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