C#从列表中选择每个线程一个IP



我的程序是一个多线程代理检查器,每当我从方法返回代理IP地址时。它应该为每个线程提供IP地址线。这是回荡的屏幕截图。

我的困扰代码(基于公共示例,与我同在):

static List<String> ips = new List<String>();// this is at the start of the program class
static Random rnd = new Random();
private static String getip()
{
    if (ips.Count == 0)
    {
        return null;
    }
    return ips[rnd.Next(0, ips.Count)];
} 

也在while (true)循环中调用GET IP,因为它是代理检查器

其他代码:

while (true)
{
    string ip = getip();
    try
    {
        using (var client = new ProxyClient(ip, user, pass))
        {
            Console.WriteLine(ip, user, pass);
            client.Connect();
            if (client.IsConnected)
            {
                return true;
            }
            else
            {
                client.Disconnect();
                return false;
            }
        }
    }
    catch
    {
        removeip(ip);
    }
    Thread.Sleep(30);
}

例如,线程1应该具有127.0.0.1(列表的第一个IP),线程2,127.0.0.2(列表中的第二个IP)等,目前的问题位于屏幕截图中。

我的线程代码:

for (int i = 0; i < threads; i++)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(Worker), i);
}

问题是,所有线程都在运行,并且可能选择相同的IP。在这里使用某些东西是随机的做法。您最好使用Parallel.ForEach()它将处理所有项目多线程,并且不会两次选择同一IP。Parallel.ForEach()将阻塞,直到处理所有项目(在ThreadPool上)

您可以尝试以下方法:

public class MyIP
{
    public string IP { get; set; }
    public bool AcceptsConnection { get; set; }
}

var l = new List<MyIP>();
// create a copy of `l`, so i can delete items
Parallel.ForEach(l.ToArray(), (item) =>
{
    try
    {
        using (var client = new ProxyClient(item.IP, user, pass))
        {
            Console.WriteLine(item.IP, user, pass);
            client.Connect();
            item.AcceptsConnection = client.IsConnected;
        }
    }
    catch
    {
        l.Remove(item);
    }
});
foreach(var item in l)
{
    Console.WriteLine(item.IP + " is " + (item.AcceptsConnection) ? " accepts connections" : " doesn not accept connections");
}

您可以更改AcceptsConnection属性,因为只有一个线程访问它。(除非您在后台做额外的事情)

最新更新