2016-06-03 7 views
1

Ich schrieb einen einfachen Proxy-Tester auf der Grundlage einiger Code, den ich hier gefunden.C# Proxy-Tester unglaublich langsam sogar auf seinem eigenen Thread

die Grundidee war, lädt es eine Datei, die eine Liste von Proxys in Form von ipaddress enthält: Port, teilt das in ein Array und Tests für die Konnektivität.

Ich führe diese Iteration in einem zweiten Thread, weil es unerträglich langsam war. Es ist jetzt etwas schneller, aber ich hoffe auf einige Vorschläge.

while ((line = reader.ReadLine()) != null) 
{ 
    if (this.lblCurrentProxy.InvokeRequired) 
    { 
     this.lblCurrentProxy.BeginInvoke((MethodInvoker)delegate() { this.lblCurrentProxy.Text = "Current proxy: " + line; ;}); 

    } 
    else 
    { 
     this.lblCurrentProxy.Text = "Current proxy: " + line; 
    } 
    //lblCurrentProxy.Text = "Current proxy: " + line; 
    String[] addressParts = line.Split(':'); 
    try 
    { 
     WebClient wc = new WebClient(); 
     wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1])); 
     wc.DownloadString("http://google.com/ncr"); 
     sw.WriteLine(line); 
     //MessageBox.Show("working proxy"); 
    } 
    catch 
    { 
     // do nothing, proxy was dead. 
     continue; 
    } 

} 

Antwort

2

Probieren Sie etwas wie folgt aus::

Der Großteil der Arbeit wird hier getan

var fileName = ""; 
var workingProxies = new List<string>(); 
Parallel.ForEach(
    File.ReadLines(fileName), 
    () => new List<string>(), 
    (line, state, bucket) => 
    { 
     String[] addressParts = line.Split(':'); 
     try 
     { 
      WebClient wc = new WebClient(); 
      wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1])); 
      wc.DownloadString("http://google.com/ncr"); 

      bucket.Add(line); 
     } 
     catch { } 
     return bucket; 
    }, 
    subBucket => 
    { 
     lock(workingProxies) 
      workingProxies.AddRange(subBucket); 
    } 
); 

//Now read from workingProxies 

Dies wird den Rahmen für Sie das Einfädeln zu behandeln. Beachten Sie außerdem, dass die gesamte Benutzeroberflächeninteraktion entfernt wurde. Es macht keinen Sinn, einen 'aktuellen' Proxy zu testen, wenn Sie mehrere Proxies gleichzeitig getestet haben. Vielmehr wird dies alle Proxies überprüfen, und dann einfach sagen, welche Proxies funktioniert.

Natürlich, wenn Sie wirklich wollten, könnten Sie Code nach bucket.Add(line) hinzufügen, um es in der Benutzeroberfläche anzuzeigen, aber das überlasse ich Ihnen.

Bearbeiten
Hier ist eine Version ohne Thread-lokale Variablen. Das bedeutet, dass wir jedes Mal sperren müssen, wenn wir die Liste anhängen, anstatt nur zu sperren, wenn die Threads abgeschlossen sind.

var fileName = ""; 
var workingProxies = new List<string>(); 
Parallel.ForEach(
    File.ReadLines(fileName), 
    line => 
    { 
     String[] addressParts = line.Split(':'); 
     try 
     { 
      WebClient wc = new WebClient(); 
      wc.Proxy = new WebProxy(addressParts[0], Int32.Parse(addressParts[1])); 
      wc.DownloadString("http://google.com/ncr"); 

      lock (workingProxies) 
       workingProxies.Add(line); 
     } 
     catch { } 
    } 
); 
+0

Parallel ist etwas, was ich neu bin - können Sie ein wenig erklären, was hier los ist? sieh es zurückkehrenden Eimer, aber zu was? Sehr verwirrt auf diesem .. –

+0

@DanSmith 'Rückkehr Eimer;' Hier ist ein bisschen irreführend. Im Wesentlichen übergibt 'Parallel.ForEach()' eine neue 'Liste ' für jeden * Thread * ('() => neue Liste ()') definiert dies. Das bedeutet, dass es jedem Thread freisteht, sich an seinen "Bucket" anzuhängen, ohne irgendwelche Thread-Sicherheitsprobleme. Wenn der threadlokale Typ nun eine * ganze Zahl * wäre, müssten wir den neuen Wert zurückgeben, da eine ganze Zahl nicht änderbar ist. Im Fall einer 'List' möchten wir jedoch einfach an die Liste anhängen und dann die gleiche Liste zurückgeben, die wir erhalten haben. – Rob

+0

@DanSmith Ich habe ein Beispiel ohne thread-lokale Variablen hinzugefügt, da ich glaube, dass das ablenkt das Ziel hier - sollte ein bisschen leichter zu verstehen sein – Rob

Verwandte Themen