2011-06-04 1 views
2

私のような少しのコードがあります:私はThreadPoolのでそれを使用しようとしていますマルチスレッドプロキシチェッカー

  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と警告していたはずです。

また、gotoをwhileループに変更することをお勧めします。後藤は悪い習慣とみなされ、あなたのケースではそれから何も得られません。