线程池未按预期工作

时间:2014-01-27 13:59:06

标签: c# multithreading

我正在尝试使用套接字连接执行简单的tcp端口扫描,并且我使用了线程池,但是我没有得到我期望的输出,线程池的代码来自{{3} }。

我的代码:

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));
    }
}

enter image description here

2 个答案:

答案 0 :(得分:2)

因为在循环完成后,除了一个排队任务之外的所有任务都在运行,所以当它们运行时,我总是50个。你需要获取循环变量的本地副本:

for (var i = 0; i < 50; i++)
{
    var port = i;

    pool.QueueTask(() => tcpConnect(dstIpAddress, port));
}

答案 1 :(得分:2)

i变量开始被捕获,而不是它的值。将你的循环改为:

for (var i = 0; i < 50; i++)
{
  int port = i;
  pool.QueueTask(() => tcpConnect(dstIpAddress,port));
}