2016-07-10 10 views
-1

Ich habe vor kurzem versucht, eine foreach-Schleife zu fädeln, weil es die Benutzeroberfläche einfror, wenn es lief. Diese Schleife durchsucht eine Reihe von Protokolldateien und ruft Informationen zeilenweise ab, fügt sie dann einer listView hinzu (druckt auch etwas in eine richtextBox). Das Problem, das ich habe, ist, dass nach dem Threading dieser Schleife scheint, dass weder die ListView noch die RichTextBox aktualisieren. Ich weiß genau, dass die Methode aufgerufen wird, denn wenn ich nach der 'if-Anweisung' eine MessageBox anbringe, öffnet sie sich gut, aber alles andere weigert sich zu arbeiten.BackgroundWorker Funktioniert einwandfrei

public void searchForAll(object sender, DoWorkEventArgs e) 
    { 
     if (//argument) 
     { 
      listViewEx1.Items.Clear(); 
      int logcount = 0; 
      richTextBoxEx1.Text += "Print something"; 
      richTextBoxEx1.Text += "\n"; 
      richTextBoxEx1.SelectionStart = richTextBoxEx1.Text.Length; 
      richTextBoxEx1.ScrollToCaret(); 
      foreach (User user in s.Friends) 
      { 
       foreach (string log in Directory.GetFiles(path, "*.log")) 
       { 
        string[] fileToRead = File.ReadAllLines(log); 
        foreach (string line in fileToRead) 
        { 
         if (line.Contains(user.Handle) && line.Contains("-r")) 
         { 

          if (!isDuplicate(c)) 
          { 
           listViewEx1.Items.Add(new ListViewItem(user.Handle) 
           { 
            SubItems = { c } 
           }); 
           dupCheck.Add(c); 
           logcount++; 
          } 

         } 

        } 

       } 
       dupCheck.Clear(); 
       Thread.Sleep(1000); 
      } 
      richTextBoxEx1.Text += "Print something"; 
     } 

    } 

}

+0

Ich denke hier ist eine gute Übereinstimmung für die Verwendung von 'Async/erwarten '. 'async/await' wurde für die Arbeit mit' Input/Output'-Operationen in wenig bid freundlicheren Weg als Threading oder 'BackgroundWorker' konzipiert. – Fabio

+0

Hi, Fabio! Ich bin gerade auf async umgestiegen. Die Sache bringt mich zurück auf Platz eins. Die Verwendung von async/await friert die GUI ein, aktualisiert aber die Listenansicht und die richtextbox –

+0

Ich bekomme auch eine Warnung, dass die asynchrone Methode fehlt, warten auf die Operatoren –

Antwort

0

Es wird empfohlen, nicht direkt Teile der Benutzeroberfläche ändern innerhalb eines BackgroundWorker.DoWork Ereignis, statt ich BackgroundWorker.ReportProgress und Bearbeiten der Benutzeroberfläche innerhalb dieser Methode empfehlen. Hier

ist ein Beispiel dafür, wie ich implementieren würde ein Textbox Wert Wechsel auf ‚x‘:

public void searchForAll(object sender, DoWorkEventArgs e) 
{ 
    //Define background worker 
    var MyBack = (BackgroundWorker)sender; 
    for(...) 
    { 
    //Send some data to ReportProgress 
    MyBack.ReportProgress(0, "any object of any form goes here"); 
    } 
} 

Dann in dem Bericht Fortschritt Methode:

private void backgroundWorker1_ProgressChanged(object sender, 
ProgressChangedEventArgs e) 
{ 
    textBox1.Text = e.UserState.ToString(); 
} 

Bitte beachten Sie, dass Sie setzen Backgroundworker1.WorkerReportsProgress = true; Andernfalls kann der Mitarbeiter den Fortschritt nicht melden.

Verwandte Themen