2017-12-22 4 views
0

Ich habe ein Problem mit dem WebClient.C# WebClient mehrere Ausführung

Einfach Ich überprüfe Datei in einem Ordner verpasst. Wenn ich diese Datei nicht habe, navigiere ich mit WebClient zur Webseite und sende einen Wert, um eine Abfrage auszuführen und den Wert in der Datenbank zu speichern.

Mein Problem:

Ich habe eine Liste von 1500 Elementen zum Beispiel. Aber nach dem ersten Element wird die for-Schleife gestoppt (vielleicht) oder navigiert nicht mehr.

Mein Code:

List<string> fileneed = new List<string>(); 

im Thread

//Distinct 
      fileneed = fileneed.Distinct().ToList<string>(); 

      for (int i = 0; i < fileneed.Count; i++) 
      { 
       if (fileneed[i].Contains(".")) 
       { 
        w = new WebClient(); 
        w.OpenRead("http://mywebsite.org/collab/files.php?act=need&user=" + Properties.Settings.Default.user + "&file=" + fileneed[i]); 
        fileneed.RemoveAt(i); 

       } 
      } 

Nach Ausführung des Threads, gehe ich zu meinem PhpMyAdmin und ich sehe nur eine Datei. Andere Dateien in der Liste nicht angezeigt werden oder vorhanden sind oder mit einem seltsamen Problem, führt mein Code einmal die Schleife.

+0

_ „Aber nach dem 1. Element der für cicle gestoppt wird ** (vielleicht) **“ _ - warum nicht fügen Sie Ihren Debugger und stellen Sie sicher, dass es aufhört? Sie sollten auch keine Elemente aus einer Liste entfernen, während Sie darüber iterieren. Wenn Sie den Punkt 0 entfernen, wird Punkt 1 zu Punkt 0, aber Ihr 'i' wird niemals verringert. – CodeCaster

+0

Sie müssen die Schleife rückwärts durchlaufen: for (int i = fileneed.Count - 1; i> = 0; i--). Wenn Sie eine Liste 1,2,3,4 haben und 2 löschen, wird 3 zu 2, so dass Sie das Löschen überspringen. – jdweng

Antwort

1

Es gibt ein paar Dinge falsch mit dem Beispielcode:

1. Platz: Weil es Elemente aus der fileneed Liste an der gleichen Stelle zu entfernen sie aus der Liste lesen es Dateien in der Liste überspringen wird. Dies liegt daran, dass beim Entfernen eines Elements der Index aller folgenden Elemente um eins verkleinert wird. Wir können das umgehen, indem wir die Liste vom Ende bis zum Anfang durchlaufen.

2: Obwohl der Code eine Datei vom Server liest, tut es nichts mit der Datei, um es auf die Festplatte zu schreiben. Als solche wird die Datei einfach verloren gehen. Dies kann behoben werden, indem ein Dateistream geöffnet und kopiert wird.

3rd: WebClient und die Stream zurückgegeben von OpenRead müssen Disposed sein. Andernfalls werden die Ressourcen, die sie verwenden, nicht bereinigt und Ihr Programm wird zu einem Speicher/Connection-Schwein. Dies wird mit der using-Anweisung behoben.

Mit diesen drei Korrekturen der resultierende Code sieht wie folgt aus:

fileneed = fileneed.Distinct().ToList<string>(); 

for (int i = fileneed.Count - 1; i >= 0; i--) 
{ 
    if (fileneed[i].Contains(".")) 
    { 
     using (var w = new WebClient()) 
     using (var webFile = w.OpenRead("http://mywebsite.org/collab/files.php?act=need&user=" + Properties.Settings.Default.user + "&file=" + fileneed[i])) 
     using (var diskFile = File.OpenWrite(fileneed[i])) 
     { 
      webFile.CopyTo(diskFile); 
     } 
     fileneed.RemoveAt(i); 
    } 
} 
0

Sie öffnen eine 'Verbindung' zu dieser Datei, aber Sie lesen sie nicht oder speichern sie trotzdem. Sie müssen eine neue Datei erstellen, und von dem entfernten Stream gelesen und auf dem lokalen Datei-Stream schreiben:

using(var myFile = File.OpenWrite(fileneed[i])) 
{ 
    w.CopyTo(myFile);  
} 

this page Details siehe

0

http://mywebsite.org/collab/files.php

ich nicht kenne diese Seite was genau tust aber du solltest diese Zeile entfernen;

fileneed.RemoveAt(i); 

Jeder Iterierte, Sie entfernen das Element und Count Änderungen. Wenn Sie verarbeitete Elemente entfernen möchten, können Sie diese in einer anderen Liste und außer in der ursprünglichen Zeichenfolgenliste speichern.