C#线程并行
帮助非常欢迎和非常感谢,谢谢。这个程序是一个ProxyChecker,因为我已经买了一大堆,并且会继续使用不同的用户/通行证等代理,但有些已经过期。我添加了一个断点,它所做的实际上是跳过ProxyClient代码并直接转向1中的每个var item,如果item接受连接等,则它只返回false并结束。C#线程并行
private static void CheckProxy(object state)
{
var u = user[0];
var p = pass[0];
var l = new List<MyIP>();
Parallel.ForEach(l.ToArray(), (ip_item) =>
{
try
{
string ip = ip_item.IP;
using (var client = new ProxyClient(ip, u, p))
{
Console.WriteLine(ip, user, pass);
client.Connect();
ip_item.AcceptsConnection = client.IsConnected;
}
}
catch
{
l.Remove(ip_item);
}
});
foreach (var item in l)
{
if (item.AcceptsConnection == true)
{
WriteToFile(user[0], pass[0]);
}
Console.WriteLine(item.IP + " is " + (item.AcceptsConnection) + " accepts connections" + " doesn not accept connections");
}
}
负载IPS功能:#
private static void loadips()
{
using (TextReader tr = new StreamReader("ips.txt"))
{
var l = new List<MyIP>();
string line = null;
while ((line = tr.ReadLine()) != null)
{
l.Add(new MyIP { IP = line });
}
}
}
我已经响应了答案补充这一点。我认为这是一个可变的问题,因为变量在本地声明不公开任何想法如何解决?我无法找到一种方法来获得这种工作,似乎我是愚蠢的。谢谢。
您的代码“跳过”了Parallel.ForEach
因为当地变量l
是空列表(你只是new List<MyIP>()
创建它。
你loadips()
方法仅填充只(另一种参考列表)本地变量l
,当using
块剩下时,这是超出范围
有几种方法可以解决,如果两种方法都在如果您是同一个班级,则可以在List<MyIP>
类别的该班级中声明成员变量,并在您的loadips()
中填写该列表。
我的建议是要改变loadips()
使其回报读取IP地址的列表,并把这种从CheckProxy()
:
private static List<MyIP> loadips() // changed return type to List<MyIP>
{
using (TextReader tr = new StreamReader("ips.txt"))
{
var l = new List<MyIP>();
string line = null;
while ((line = tr.ReadLine()) != null)
{
l.Add(new MyIP { IP = line });
}
return l; // return the list!
}
}
和CheckProxy
:
private static void CheckProxy(object state)
{
var u = user[0];
var p = pass[0];
var l = loadips(); // load IPs here
Parallel.ForEach(l.ToArray(), (ip_item) =>
{
...
嗨,是否有更多的参数,为每个语句?即Parallel.ForEach(l.ToArray(),(ip_item)&&(l2.ToArray(),(userpass_item)=>? – csharpnoobie
你永远不会调用loadips () – Rick