C# 线程池未按预期工作
我正在尝试使用socket connect进行一个简单的tcp端口扫描,我正在使用一个线程池,但我没有得到预期的输出,线程池的代码来自 我的代码:C# 线程池未按预期工作,c#,multithreading,C#,Multithreading,我正在尝试使用socket connect进行一个简单的tcp端口扫描,我正在使用一个线程池,但我没有得到预期的输出,线程池的代码来自 我的代码: IPAddress dstIpAddress ; IPAddress.TryParse("192.168.2.106", out dstIpAddress); Action<IPAddress,int> tcpConnect = (( dstIp, destinationPort) => { string result
IPAddress dstIpAddress ;
IPAddress.TryParse("192.168.2.106", out dstIpAddress);
Action<IPAddress,int> tcpConnect = (( dstIp, destinationPort) =>
{
string result = "open";
try
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(dstIpAddress, destinationPort);
}
catch (Exception e)
{
result = "closed";
}
Console.WriteLine("TCP port {0} is {1}.", destinationPort, result);
});
using (var pool = new ThreadPool(10))
{
for (var i = 0; i < 50; i++)
{
pool.QueueTask(() => tcpConnect(dstIpAddress,i));
}
}
IPAddress-dstiaddress;
IPAddress.TryParse(“192.168.2.106”,不含dstiaddress);
操作tcpConnect=((dstIp,destinationPort)=>
{
字符串结果=“打开”;
尝试
{
Socket sock=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
sock.Connect(dstIpAddress,destinationPort);
}
捕获(例外e)
{
结果=“关闭”;
}
WriteLine(“TCP端口{0}是{1}.”,destinationPort,result);
});
使用(变量池=新线程池(10))
{
对于(变量i=0;i<50;i++)
{
QueueTask(()=>tcpConnect(dstIpAddress,i));
}
}
因为除了一个排队的任务外,其他所有任务都在循环完成后运行,所以当它们运行时,i始终为50。您需要获取循环变量的本地副本:
for (var i = 0; i < 50; i++)
{
var port = i;
pool.QueueTask(() => tcpConnect(dstIpAddress, port));
}
for(变量i=0;i<50;i++)
{
var-port=i;
QueueTask(()=>tcpConnect(dstIpAddress,port));
}
因为除了一个队列任务外,所有队列任务都在循环完成后运行,所以在它们运行时,i始终为50。您需要获取循环变量的本地副本:
for (var i = 0; i < 50; i++)
{
var port = i;
pool.QueueTask(() => tcpConnect(dstIpAddress, port));
}
for(变量i=0;i<50;i++)
{
var-port=i;
QueueTask(()=>tcpConnect(dstIpAddress,port));
}
变量是begin caqptured,而不是它的值。将循环更改为:
for (var i = 0; i < 50; i++)
{
int port = i;
pool.QueueTask(() => tcpConnect(dstIpAddress,port));
}
for(变量i=0;i<50;i++)
{
int端口=i;
QueueTask(()=>tcpConnect(dstIpAddress,port));
}
变量是begin caqptured,而不是它的值。将循环更改为:
for (var i = 0; i < 50; i++)
{
int port = i;
pool.QueueTask(() => tcpConnect(dstIpAddress,port));
}
for(变量i=0;i<50;i++)
{
int端口=i;
QueueTask(()=>tcpConnect(dstIpAddress,port));
}
使用Resharper将提示您显式捕获变量。很棒的工具使用Resharper将提示您显式捕获变量。很棒的工具