Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程池未按预期工作_C#_Multithreading - Fatal编程技术网

C# 线程池未按预期工作

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

我正在尝试使用socket connect进行一个简单的tcp端口扫描,我正在使用一个线程池,但我没有得到预期的输出,线程池的代码来自

我的代码:

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将提示您显式捕获变量。很棒的工具