2011-06-04 55 views
2

我有一个像小码:多线程代理检查

  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; 
       } 
      } 

我试图与线程池使用它:

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

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

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

这是为什么?关于如何让这个工作的任何建议?

回答

2

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

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

此外,我建议改变你转到成while循环。转到被认为是不好的做法,在你的情况下,你不从中获得任何东西。