我根据我在这里找到的一些代码编写了一个简单的代理测试程序。
基本思想是,它加载一个文件,其中包含ipaddress:port形式的代理列表,将其拆分为数组,并测试连接性。
我在第二个线程中运行此迭代,因为它无法忍受缓慢。它现在有点快,但我希望有一些建议。
大部分工作都在这里完成:
while ((line = reader.ReadLine()) != null)
{
if (this.lblCurrentProxy.InvokeRequired)
{
this.lblCurrentProxy.BeginInvoke((MethodInvoker)delegate() { this.lblCurrentProxy.Text = "Current proxy: " + line; ;});
}
else
{
this.lblCurrentProxy.Text = "Current proxy: " + line;
}
//lblCurrentProxy.Text = "Current proxy: " + line;
String[] addressParts = line.Split(':');
try
{
WebClient wc = new WebClient();
wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1]));
wc.DownloadString("http://google.com/ncr");
sw.WriteLine(line);
//MessageBox.Show("working proxy");
}
catch
{
// do nothing, proxy was dead.
continue;
}
}
答案 0 :(得分:2)
尝试这样的事情:
var fileName = "";
var workingProxies = new List<string>();
Parallel.ForEach(
File.ReadLines(fileName),
() => new List<string>(),
(line, state, bucket) =>
{
String[] addressParts = line.Split(':');
try
{
WebClient wc = new WebClient();
wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1]));
wc.DownloadString("http://google.com/ncr");
bucket.Add(line);
}
catch { }
return bucket;
},
subBucket =>
{
lock(workingProxies)
workingProxies.AddRange(subBucket);
}
);
//Now read from workingProxies
这使得框架可以为您处理线程。另请注意,所有UI交互都已删除。当您可能同时测试多个代理时,对“当前”代理进行测试是没有意义的。相反,这将检查所有代理,然后简单地告诉您哪些代理工作。
当然,如果您真的想要,可以在bucket.Add(line)
之后添加一些代码以在UI中显示它,但我会留给您。
修改强>
这是一个没有线程局部变量的版本。这意味着我们需要在每次附加到列表时锁定,而不是仅在线程完成时锁定。
var fileName = "";
var workingProxies = new List<string>();
Parallel.ForEach(
File.ReadLines(fileName),
line =>
{
String[] addressParts = line.Split(':');
try
{
WebClient wc = new WebClient();
wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1]));
wc.DownloadString("http://google.com/ncr");
lock (workingProxies)
workingProxies.Add(line);
}
catch { }
}
);