Многопоточная проверка прокси

У меня есть небольшой код, например:

            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, последний элемент в списке.

Почему это? Любые предложения о том, как я могу заставить это работать?


person Milan Solanki    schedule 04.06.2011    source источник


Ответы (1)


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

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

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

person ChrisWue    schedule 04.06.2011