异步Socket在关闭以后出错。
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
try{}catch{}捕获不了Socket.Close()异常,感觉因该是程序卸载内存时候出的错。
以下是异常内容:
未处理的“System.InvalidOperationException”类型的异常出现在 system.dll 中。
其他信息: AcceptCallback
多谢!
解决方案 »
- asp.net/c#查询语句一加where就无结果,是怎么回事?
- 请教关于“写狗程序”的一些问题
- 关于数组保存的问题?我是业余新手~~求各位大哥指点下,放分~~~
- C#连接sql数据库后,select语句的执行
- 文件传输时间计算
- 一个ReaderWriterLockSlim的问题
- 请问企业库的数据访问类库如何执行带参数的sql语句?
- 大家平时都用到什么算法? 什么比较重要?有无 c# 相关书籍 ?
- 请教高手用C#做WEB页,如何做弹出对话框(MessageBox)?
- 急!怎么在pictureBox1中加载图片名称与 textBox1中录入内容相同的图片?
- 一个关于变量刷新的问题,请各位前辈帮忙
- 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这个方法。
谢谢楼上的兄弟们了!
----------------------------------
但是我没有看懂他的解决办法