求一最佳解决方案关于c# socket和多线程 你要用多线程去连接,这样单线程肯定很慢了,连接一个服务端是,特别是TCP很慢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 几年没来CSDN看帖子了说一下我的办法吧,大家拍砖先从数据库拿到地址端口的清单,例如:192.168.1.4:1234....192.168.1.5:2345将这些数据放入一个QUEUE里面用线程池TheadPool.Acc....WorkThread方法去从QUEUE里面取地址端口信息进行扫描扫描结果当然也可以使用QUEUE进行进站处理例如private static Queue<string> sQueue = new Queue<string>();private static void Scan(){ foreach(datarow row in dt.rows) { sQueue.Enqueue(string.format("{0}:{1}",row["IP"],row["port"]); } int threadCount = 10; for(int i=0;i<threadCount;i++) { ThreadPool.QueueWork...(new ...Callback(ThreadScan),null); }}private static Queue<string> resultQueue = new Queue<string>();private static void ThreadScan(object state){ string msg = string.em; lock(sQueue) { if(sQueue.Count == 0) { return; } msg = sQueue.DeQueue(); } string[]para = ms.split(':'); IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]); using(Socket sck = new Socket(....)) { try { sck.Connect(rep); //do something.. lock(resultQueue) { resultQueue.EnQueue(msg);//add remote endpoint to the queue } sck.Close(); }} 当然那个10次循环的位置,也可以自己去创建线程Thead thread = new Thread(new ThreadStart(ThreadScan));这样的话,ThreadScan 方法去掉参数就好个人觉得用TheadPool更方便,效率可能更高,因为线程池会自动维护线程的开启与销毁 private static void ThreadScan(object state) { string msg = string.em; lock(sQueue) { if(sQueue.Count == 0) { return; } msg = sQueue.DeQueue(); } string[]para = ms.split(':'); IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]); using(Socket sck = new Socket(....)) { try { sck.Connect(rep); //do something.. lock(resultQueue) { resultQueue.EnQueue(msg);//add remote endpoint to the queue } sck.Close(); } }更正如下private static void ThreadScan(object state) { while(true){ string msg = string.em; lock(sQueue) { if(sQueue.Count == 0) { return; } msg = sQueue.DeQueue(); } string[]para = ms.split(':'); IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]); using(Socket sck = new Socket(....)) { try { sck.Connect(rep); //do something.. lock(resultQueue) { resultQueue.EnQueue(msg);//add remote endpoint to the queue } sck.Close(); } }} WPF 行为代码 层里面有个图片 怎么能让文字在图片左上角悬浮 .net中有没有连接数据源的textbox控件 关于类型转化的问题 winform 页面显示问题 MediaElement控件的问题(WPF中)? js,c#限定内容 求大神,为什麽出现subscript out of range 完全反编译一外国C#软件后的问题 如何更改密码? snmp.net框架? 用C#怎么才能隐藏另外一个程序在系统托盘里的图标呢?
说一下我的办法吧,大家拍砖
先从数据库拿到地址端口的清单,例如:
192.168.1.4:1234
....
192.168.1.5:2345
将这些数据放入一个QUEUE里面
用线程池TheadPool.Acc....WorkThread
方法去从QUEUE里面取地址端口信息进行扫描
扫描结果当然也可以使用QUEUE进行进站处理
例如
private static Queue<string> sQueue = new Queue<string>();
private static void Scan()
{
foreach(datarow row in dt.rows)
{
sQueue.Enqueue(string.format("{0}:{1}",row["IP"],row["port"]);
}
int threadCount = 10;
for(int i=0;i<threadCount;i++)
{
ThreadPool.QueueWork...(new ...Callback(ThreadScan),null);
}
}private static Queue<string> resultQueue = new Queue<string>();
private static void ThreadScan(object state)
{
string msg = string.em;
lock(sQueue)
{
if(sQueue.Count == 0)
{
return;
}
msg = sQueue.DeQueue();
} string[]para = ms.split(':');
IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]);
using(Socket sck = new Socket(....))
{
try
{
sck.Connect(rep);
//do something..
lock(resultQueue)
{
resultQueue.EnQueue(msg);//add remote endpoint to the queue
}
sck.Close();
}
}
Thead thread = new Thread(new ThreadStart(ThreadScan));这样的话,ThreadScan 方法去掉参数就好
个人觉得用TheadPool更方便,效率可能更高,因为线程池会自动维护线程的开启与销毁
{
string msg = string.em;
lock(sQueue)
{
if(sQueue.Count == 0)
{
return;
}
msg = sQueue.DeQueue();
} string[]para = ms.split(':');
IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]);
using(Socket sck = new Socket(....))
{
try
{
sck.Connect(rep);
//do something..
lock(resultQueue)
{
resultQueue.EnQueue(msg);//add remote endpoint to the queue
}
sck.Close();
}
}
更正如下private static void ThreadScan(object state)
{
while(true)
{
string msg = string.em;
lock(sQueue)
{
if(sQueue.Count == 0)
{
return;
}
msg = sQueue.DeQueue();
} string[]para = ms.split(':');
IPEndPoint rep = new IPEndPoint(Ipaddress.Parse(para[0]),int.Parse(para[1]);
using(Socket sck = new Socket(....))
{
try
{
sck.Connect(rep);
//do something..
lock(resultQueue)
{
resultQueue.EnQueue(msg);//add remote endpoint to the queue
}
sck.Close();
}
}
}