MultiThreaded Proxy Checker

时间:2011-06-04 08:28:53

标签: c# .net windows webforms webclient

我的代码很少:

            using (WebClient wc = new WebClient())
            {
                wc.Proxy = new WebProxy("IP", Port);

            resume:
                if (!wc.IsBusy)
                {
                    string rtn_msg = string.Empty;
                    try
                    {
                        rtn_msg = wc.DownloadString(new Uri("http://google.com/"));
                    }
                    catch (WebException) { }
                    catch (Exception) { }
                }
                else
                {
                    System.Threading.Thread.Sleep(1000);
                    goto resume;
                }
            }

我正在尝试将它与ThreadPool一起使用:

        foreach (Proxy proxy in s)
        {
            ThreadPool.QueueUserWorkItem((c) =>
            {
                this.CheckProxy(proxy);
            });
        }

问题是所有线程都会检查列表中的最后一个代理。

例如,在代理列表中使用ip1,ip2,ip3,ip4,所有线程都检查ip4,列表中的最后一项。

为什么?关于如何让它发挥作用的任何建议?

1 个答案:

答案 0 :(得分:2)

如果你有像ReSharper这样的工具,它会用Access to modified closure警告你。您需要制作本地副本:

    foreach (Proxy proxy in s)
    {
        var p = proxy;
        ThreadPool.QueueUserWorkItem((c) =>
        {
            this.CheckProxy(p);
        });
    }

另外我建议将你的goto改成while循环。 Goto被认为是不好的做法,在你的情况下,你没有从中获得任何东西。