即使在自己的线程上,C#代理测试器也令人难以置信地缓慢

时间:2016-06-03 02:00:16

标签: c# multithreading proxy

我根据我在这里找到的一些代码编写了一个简单的代理测试程序。

基本思想是,它加载一个文件,其中包含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;
    }

}

1 个答案:

答案 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 { }
    }
);