我的程序是一个多线程代理检查器,每当我从方法返回代理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
属性,因为只有一个线程访问它。(除非您在后台做额外的事情)