2016-07-22 19 views
-1

Hallo, also meine Schule hat Aufzeichnungen, die ich zugreifen musste, aber ich habe vergessen, meine Benutzer-ID, so machte ich ein Programm, das jede mögliche PDF-Datei herunterladen und sie nach meinem Namen suchen würde. Wenn es meine gefunden hat, würde es mich jedoch warnen, wenn das Programm heruntergefahren war und sagte: "Wir haben eine Datei gefunden, die Sean Dateiname enthält: xxxxxx.pdf" Der tatsächliche Zahlenteil wäre ausgeschaltet, egal wie stark die for-Schleife inkrementiert wird war auf einer separaten Methode! BTW Schulname wird hervorgehoben!C#} For Loop-Probleme

* D ie Art und Weise! In Search() verwenden I i-10 als temporäre Lösung, aber ich war ihr Denken muss ein besserer Weg geben *


using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using BitMiracle.Docotic.Pdf; // pdf parser/viewer 
using System.IO; 
using System.Threading; 

namespace XXXXXXX_TEMP 
{ 
    class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p1 = new Program(); 
     p1.Start(); 
    } 

    private void Start() 
    { 
     WebClient wc = new WebClient(); 
     for (int i = 200000; i < 999999999; i = i + 10) 
     { 
      try 
      { 
       wc.DownloadFile("XXXXXXXXXXXXXXXXXXXXXX/" + i + ".pdf", i + ".pdf"); 
      } 
      catch (WebException) { 
       continue; 
      } 
      PdfDocument pdf = new PdfDocument(i + ".pdf"); 
      Thread a = new Thread(() => Search(i, pdf)); 
      a.Start(); 

      if (i == 999999) { 
       Console.ReadLine(); 
      } 
     } 
    } 

    private void Search(int i, PdfDocument pdf) 
    { 
     i = i - 10; 
     String html = pdf.GetText(); 
     if (html.ToLower().Contains("sean")) 
     { 
      Console.WriteLine("Found File Containing Sean! File Name Is : " + i + ".pdf\n"); 
      Console.WriteLine("PDF Text = " + html); 
     } 
    } 
    } 
} 
+0

Dieser sehr häufige Fehler wird bereits in einer Reihe anderer Stack Overflow Q & A behandelt, einschließlich des markierten Duplikats. Siehe insbesondere [diese Antwort] (http://stackoverflow.com/a/3157918) für eine gute Erklärung. –

+0

@PeterDuniho Sehr Sorry, Das passiert mir oft, da ich Probleme habe, Dinge zu formulieren. Ich werde nächstes Mal viel vorsichtiger sein, sorry. –

Antwort

0

Was Sie ausgeführt haben in ist closing over the loop variable genannt. Sie sollten die verknüpfte Antwort sowie den Blogeintrag, auf den sie verweist, sorgfältig lesen.

Die sofortige Lösung für Ihr Problem besteht darin, eine Kopie von i an den Thread zu übergeben. Das heißt:

int index = i; 
Thread a = new Thread(() => Search(index, pdf)); 

Allerdings könnten Sie feststellen, dass alle Threads beginnen ernsthaft Ihr System versinkt, und verlassen alle diese Fäden hängen möglicherweise auf Ressourcen essen konnte und zu einem der Speicher Ausnahme führen. Ein sauberer Weg, es zu tun ist ThreadPool.QueueUserWorkItem zu nennen, wie folgt aus:

ThreadPool.QueueUserWorkItem(o => Search(index, pdf)); 

Oder in neueren Versionen von .NET:

Task.Run(() => Search(index, pdf)); 

Simplest way to do a fire and forget method in C#? finden Sie weitere Informationen über Fire-and-Forget-Threads.

+0

@SeandaPotato: Der Hauptpunkt ist, dass Ihre Lösung * inkorrekt * ist, da sie einige Dokumente überspringen und andere mehrfach verarbeiten kann. Jede Geschwindigkeitsdifferenz liegt in der Größenordnung von Mikrosekunden. Die 'i-10' Sache ist nicht zuverlässig. –

+0

Ah okay. Eine weitere Frage, die ich aus MSDN gelesen habe, ist, dass Task.Run() der neue und einfachere Weg von Task.Facotry.StartNew() ist, aber den Benutzer daran hindert, bestimmte Dinge zu tun. Das eine, das mir bei Task.Run verwirrend erscheint, ist, dass es besagt, dass es das ausführt, was Sie aus dem Thread-Pool senden. Muss ich diesen Threadpool erstellen oder ist er bereits vorhanden? Auch mit ThreadPool.QueueUserWorkItem (o => Suche (Index, pdf)); Muss ich hier einen Thread-Pool erstellen oder wird er wieder vom System behandelt? –

+0

@SeandaPotato: Der Thread-Pool wird automatisch vom System erstellt und verwaltet. Weitere Informationen finden Sie unter https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx. –