异步Socket在关闭以后出错。
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
解决方案 »
- 求一个解压方法,用ZipInputStream的
- C#中如何判断一个类是静态类?
- 怎样记录C#进程退出的原因??
- 2005中如何挂起一个线程? Suspend()提示说已经过期
- 我的ASP.NET项目中有一个页面有这种错误:Server Application Unavailable(页面有一个treeview控件读数据库),其他页面没有这种错误.
- 请问如何屏避Ctrl和ALT键?
- 请教下用OleDb怎么访问Sql 2000数据库表的primary key?
- c# 自定义公式
- c#中,两个list联合排序的问题
- 如何将DATAGRID中的内容提交道数据库
- 一个关于变量刷新的问题,请各位前辈帮忙
- C#基础问题 请高手指教 谢谢
Close 方法可关闭远程主机连接,并释放所有与 Socket 关联的托管资源和非托管资源。关闭后,Connected 属性将设置为 false。对于面向连接的协议,建议先调用 Shutdown,然后再调用 Close 方法。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。如果需要在不首先调用 Shutdown 的情况下调用 Close,则可以将 DontLinger Socket 选项设置为 false,并且指定一个非零的超时间隔,从而可以确保排队等待输出的数据得到发送。这样,Close 将会一直阻塞到发送完该数据或指定的时限超时为止。如果将 DontLinger 设置为 false,并且指定了一个非零的超时间隔,Close 将会释放连接并自动放弃排队等待输出的数据。注意 若要将 DontLinger 套接字选项设置为 false,需创建 LingerOption,将启用的属性设置为 false,并将 LingerTime 属性设置为所需的超时时长。将该 LingerOption 和 DontLinger 套接字选项一起使用,可调用 SetSocketOption 方法。
用Shutdown可以防止这种现像的发生并保证数据的完整性,但也会导致Socket不能立即关闭。所以用不用要看你的需求。
---------------------------
5 楼lhj0532(klinsmann)回复于 2006-03-02 15:29:58 得分 0 知道答案了。
Accept之前一定要先Poll无论是同步还是异步,看看有没有请求的连接,如果有就Accept。如果没有Poll则Socket服务会一直阻塞监听,如果这时Close,就会抛出异常。
MSDN的实例几乎没有Socket服务的Close,所以没有用到Poll这个方法。
谢谢楼上的兄弟们了!
----------------------------------
但是我没有看懂他的解决办法