2011-04-25 3 views
1

을 확인하여 내가 ... 프록시를 확인합니다 프로그램을 쓰고 싶었다 나는 멀티 쓰레드를 사용하고 싶어하지만, 돈`t이 내 프로그램에 적용하는 방법을 정말 알고 : 코드에멀티 스레딩이

int ktory = 0; 

// Button to start multithreading 
private void p_check_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Thread th = new Thread(test_proxy); 
     CheckForIllegalCrossThreadCalls = false; 
     th.Start(); 
    } 

} 

//This is my function to test proxies 
private void test_proxy() 
{ 
    try 
    { 

     int ile = p_listbox.Items.Count; 

     string proxy = null; 
     //'ktory' - means position in listbox 
     proxy = p_listbox.Items[ktory].ToString(); 
     ktory += 1; 

     //Splitting on IP and PORT 
     int gdzie = proxy.IndexOf(":"); 
     string IP = proxy.Remove(gdzie); 
     string ipp = proxy.Replace(IP + ":", ""); 
     int PORT = Int32.Parse(ipp); 
     //end o splitting 

     //My testing of anonimty (works good don`t need to check) 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(p_proxyjudge.Text); 
     WebProxy adr_proxy = new WebProxy(IP, PORT); 
     adr_proxy.UseDefaultCredentials = true; 
     request.Proxy = adr_proxy; 
     request.Timeout = 15000; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     Stream stream = response.GetResponseStream(); 

     // Checking if anonymous (not important) 
     StreamReader sr = new StreamReader(stream); 
     while (sr.EndOfStream != true) 
     { 
      string checking = sr.ReadLine(); 
      if (!checking.Contains("REMOTE_ADDR =")) 
       p_work.Items.Add(proxy); 
     } 

     sr.Close(); 
     stream.Close(); 
    } 
    catch (Exception ex) 
    { 
     ktory += 1; 
    } 
} 

< : ILE 및 ktory 그냥 같은, 또는 여러 변수>

로 J하지만 내 멀티 스레딩은 10 첫째 프록시에 중지하거나

가장 큰 문제는 프록시를 확인하는 (10 개) 로봇을 만드는 것입니다 ... 하나 그들에게 10 배 번 확인 한 프록시가 다른 프록시로 이동했는지 확인한 후 목록 상자에서

는 ME가 :) 난`그것에 2 일 앉아 도와주세요 (하지만 여전히 다른 사람의 봇은 백그라운드에서 작동) 그리고 당신이 변경되고있는, ktory에 대한 액세스 주위에 고정되지

+0

CheckForIllegalCrossThreadCalls = false; ... 아마 좋은 생각이 아닙니다. 아마도 스레드에서 컨트롤에 올바르게 액세스하는 방법을 조사하고 싶을 것입니다. 위임자, 호출 등 –

+0

10 개의 스레드 만 작성하여 해당 함수를 호출하므로 10 회만 실행됩니다. 또한,'ktory + = 1;'은 threadsafe가 아닙니다. 코드의 나머지 부분을 살펴 보지 않았으므로 언급 한 결과가 표시됩니다. – Rob

+0

희망 스팸을 – Poma

답변

2

그것을 알아낼 수 없습니다 여러 스레드로. 이 때문에 10 개의 스레드가 10 개의 다른 프록시를 확인할 수 있다고 보장 할 수 없습니다.

Object _lock = new Object(); 
int ktory=0; 

... 
private void test_proxy() 
{ 
    try 
    { 
    int ile = p_listbox.Items.Count; 

    string proxy = null; 
    //'ktory' - means position in listbox 
    lock (_lock) { 
     proxy = p_listbox.Items[ktory].ToString(); 
     ktory += 1; 
    } 
... 
+1

+1에 사용하지 않기를 바랍니다. 또한, Interlocked.Increment가 유용 할 것입니다 - http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx – Rob

관련 문제