Многопоточная проверка прокси - PullRequest
2 голосов
/ 04 июня 2011

У меня есть маленький код вроде:

            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 Ответ

2 голосов
/ 04 июня 2011

Если бы у вас был такой инструмент, как ReSharper, он бы предупредил вас с помощью Access to modified closure. Вам нужно сделать локальную копию:

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

Также я бы предложил изменить ваше goto в цикл while. Goto считается плохой практикой, и в вашем случае вы ничего от этого не получите.

...