首页 新闻 会员 周边 捐助

并发时Tcpclient.BeginConnect的返回值Tcpclient.Socket为null是咋回事

0
悬赏园豆:20 [已关闭问题] 关闭于 2017-10-09 11:40

具体描述:

用线程池开多个线程对不同ip和端口发送指令(线程池的最大线程数量>所有套ip端口的数量)

foreach

{

ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(false), new WaitOrTimerCallback(t.CreatDeviceAndAddMachines), i, NetDeviceHelper.RequestDelauMs, true);  

}

具体发送指令的方法

异步方法

tcpclient.BeginConnect(serverip, serverport,
new AsyncCallback(CallBackMethod), tcpclient);

回调方法

TcpClient tcpclient = asyncresult.AsyncState as TcpClient;

if (tcpclient.Client != null)
{
hrow new TimeoutException("IsConnectionFailed");
}

 

发现:

比如我对192.168.40.23:10011能正常发送指令并接收数据,

当我的集合数量比较小的时候,比如10个,192.168.40.23(10001-10011),那么当轮训到这个端口的时候,是可以正常发送接收数据的,

但是当集合数量比较多的时候,比如100个192.168.40.23(10001-10111),那么当轮训到这个端口的时候,tcpclient.Client ==null,一直发IsConnectionFailed的异常

猝不及防的主页 猝不及防 | 老鸟四级 | 园豆:2878
提问于:2017-08-24 17:34
< >
分享
所有回答(1)
0

现在问题差不多解决了,但是只是我碰巧改的,原理并不清楚,希望高人来解答

当集合多的时候,socket报的错误有三种,10022,10056和socket为null,由于我用的是串口服务器,串口设备通过这个串口服务器变成网络设备,可能性能不高。

我在线程池注册委托的时候加了一个延迟50ms,两个委托之间相差50ms,然后读到数据的几率就大大增大了,不明所以,只能说是解决了问题

猝不及防 | 园豆:2878 (老鸟四级) | 2017-08-25 15:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册