socket的问题 本帖最后由 jiabiao113 于 2010-07-27 12:06:46 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 当然,用别的方法,比如:Socket.BeginAccept (AsyncCallback, Object) 这个方法只接受连接请求 不等待数据包, 就不存在这个问题。但是如果想用Socket.BeginAccept (Int32, AsyncCallback, Object) 重载,也该有解决办法吧? BeginAccept 不会阻塞调用它的线程,因为它是运行在一个新的线程上。如果调用线程阻塞了,最有可能就是你在 BeginAccept 调用了什么 EventWaitHandle, Mutex, Monitor 之类的东东自己堵死了自己。 、有点明白了原本只想用一个专门的线程来处理连接请求的(不是主线程) while (true) { listener.BeginAccept(10, new AsyncCallback(SocketListener.acceptCallback), listener ); }结果一个客户端一直连接不上,就会影响后面的客户端连接。 应该是:while (true) { allDone.Reset(); listener.BeginAccept(10, new AsyncCallback(SocketListener.acceptCallback), listener ); allDone.WaitOne(); } 两码事,调用 EndAccept 就结束掉这个线程了。如果设计没有错误,每次 BeginAccept 都会在线程池中拿一条线程出来来,它们是互不干涉的,更加不应该有阻塞的情况。此外,异步调用的就是线程池的线程,用完了就赶快释放。如果非要霸占这个线程,那样就是去异步的意义了,还不如开一条线程搞同步。 真正的异步操作不需要用 EventWaitHandle, 某些教程类型里面的 EventWaitHandle 都是为了方便初学者理解而已。用了 EventWaitHandle, 异步就变同步。codeproject 上有很多可以实用的例子 哦 原来是这样。正纳闷msdn里面的例子为什么要在原来的地方停下来,然后开个新线程工作,完成之后 主线程接着运行。 C#2010做航空机票预订管理系统登录界面有问题 ……C#写的windows服务程序,为什么监听不到TCP连接? 一个新问题, 有难度. 如何根据用户名密码自动登陆到adsl, 防火墙. 用C# 获取路由相关信息 读取XML文档时的进度条如何控制 winform打包 问关于TREEVIEW选择的问题?? 该如何获得当前计算机的代理服务器地址及端口? 点击登录按钮登录无反应 WPF 母控件如何将事件推送给自定义UserControl Winform的文件上传下载,如何做呢? 远程互联网上实现 DataGridView编辑文本Format的问题
Socket.BeginAccept (AsyncCallback, Object)
这个方法只接受连接请求 不等待数据包, 就不存在这个问题。但是如果想用
Socket.BeginAccept (Int32, AsyncCallback, Object)
重载,也该有解决办法吧?
有点明白了原本只想用一个专门的线程来处理连接请求的(不是主线程)
while (true) {
listener.BeginAccept(10,
new AsyncCallback(SocketListener.acceptCallback),
listener );
}结果一个客户端一直连接不上,就会影响后面的客户端连接。
allDone.Reset();
listener.BeginAccept(10,
new AsyncCallback(SocketListener.acceptCallback),
listener );
allDone.WaitOne();
}
两码事,调用 EndAccept 就结束掉这个线程了。
如果设计没有错误,每次 BeginAccept 都会在线程池中拿一条线程出来来,它们是互不干涉的,更加不应该有阻塞的情况。此外,异步调用的就是线程池的线程,用完了就赶快释放。如果非要霸占这个线程,那样就是去异步的意义了,还不如开一条线程搞同步。
真正的异步操作不需要用 EventWaitHandle, 某些教程类型里面的 EventWaitHandle 都是为了方便初学者理解而已。用了 EventWaitHandle, 异步就变同步。codeproject 上有很多可以实用的例子
哦 原来是这样。
正纳闷msdn里面的例子为什么要在原来的地方停下来,然后开个新线程工作,完成之后 主线程接着运行。