2017-10-04 2 views
0

Ich habe ein Programm in C# und ich verwende eine While-Schleife, um Zeilen aus einer Datei zu lesen. Ich möchte in der Lage sein, die Zeilennummer alle 5 Sekunden oder so anzuzeigen, ohne die while-Schleife zu verlangsamen, damit der Benutzer sehen kann, wie weit sie sind. Irgendwelche Ideen wie man das macht?C# Aufruf der Funktion in der While-Schleife alle X Sekunden ohne Sperrschleife

CODE

try 
    { 
     // Create an instance of StreamReader to read from a file. 
     // The using statement also closes the StreamReader. 
     Stopwatch sw = Stopwatch.StartNew(); 
     using (StreamReader sr = new StreamReader(@"C:\wamp64\www\brute-force\files\antipublic.txt")) 
     { 
      String line; 
      int lines = 0; 
      // Read and display lines from the file until the end of 
      // the file is reached. 
      using (System.IO.StreamWriter file = new System.IO.StreamWriter("C:/users/morgan/desktop/hash_table.txt")) 
      { 
       while ((line = sr.ReadLine()) != null) 
       { 
        file.WriteLine(CreateMD5(line)+':'+line); 
        lines++; 
       } 
      } 
     } 

     sw.Stop(); 
     Console.WriteLine("Time taken: {0}s", sw.Elapsed.TotalSeconds); 
     Console.ReadLine(); 
    } 
    catch (Exception e) 
    { 
     // Let the user know what went wrong. 
     Console.WriteLine("The file could not be read:"); 
     Console.WriteLine(e.Message); 
    } 
} 
+0

Ausführen von Code zum Lesen von Dateien im Hintergrundthread und Senden einer Benachrichtigung an den UI-Thread. –

+1

Konnte nicht ein einfaches 'if (sw.Elapsed.TotalSeconds% 5 == 0) Console.WriteLine (Zeilen +" Zeilen lesen bis jetzt ... ");' nach 'Zeilen ++' in Ihrer while-Schleife arbeiten? –

+1

Simple Console.WriteLine alle 5 Sekunden wird den Loop nicht wesentlich verlangsamen. Oder Sie können Task.Run verwenden –

Antwort

3

können Sie die BackgroundWorker Klasse verwenden, um dies zu achive. Sehen Sie sich das MSDN-Beispiel zur Initialisierung der Klasse an.

Sie könnten ein „DoWork“ Verfahren für den Background mit einem Report Aufruf wie folgt erstellen:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    Stopwatch sw = Stopwatch.StartNew(); 
    using (StreamReader sr = new StreamReader(@"path")) 
    { 
     String line; 
     int lines = 0; 

     using (System.IO.StreamWriter file = new System.IO.StreamWriter("path")) 
     { 
      while ((line = sr.ReadLine()) != null) 
      { 
       file.WriteLine(CreateMD5(line)+':'+line); 
       worker.ReportProgress(lines++); 
      } 
     } 
    } 
} 

den Fortschritt anzuzeigen einfach Sie Console.WriteLine() bei Progress verwenden können.

+0

Die MSDN-Dokumentation besagt, dass der ProgressChanged-Ereignishandler auf dem Thread ausgeführt wird, der den BackgroundWorker erstellt hat. DoWork sollte in einem anderen Thread ausgeführt werden als die erstellte Instanz von BackgroundWorker. – Shamshiel

Verwandte Themen