2010-12-21 3 views
0

In C# ich bin eine Anwendung basierend auf Thread erstellen, die eine Textdatei von Computer (eigentlich Remote-Computer) gelesen von Benutzer ausgewählt. Wenn der Benutzer Änderungen an der Originaldatei vornimmt, sollte diese Anwendung die geänderte Datei (ganz) anzeigen.Automatische Dateiaktualisierung in C#?

Erfolgreich ist es aber, Thread, den ich benutze, weiß nicht wie und wo zu platzieren, dass es kontinuierlich liest die ursprüngliche Datei aus dem Hintergrund. Meine Anwendung wird hängt mit diesem Code

public partial class FormFileUpdate : Form 
{ 
    // This delegate enables asynchronous calls for setting the text property on a richTextBox control. 
    delegate void UpdateTextCallback(object text); 

    // This thread is used to demonstrate both thread-safe and unsafe ways to call a Windows Forms control. 
    private Thread autoReadThread = null; 


    public FormFileUpdate() 
    { 
     InitializeComponent(); 

     //Creating Thread 
     this.autoReadThread = new Thread(new ParameterizedThreadStart(UpdateText)); 
    }  

    private void openToolStripButton_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog fileOpen = new OpenFileDialog(); 
     fileOpen.Title = "Select a text document"; 
     fileOpen.Filter = @"Text File|*.txt|Word Document|*.rtf|MS office Documnet|*.doc|See All files|*.*"; 
     fileOpen.FilterIndex = 1; 
     fileOpen.RestoreDirectory = true; 
     fileOpen.Multiselect = false; 
     if (fileOpen.ShowDialog() == DialogResult.OK) 
     {   
      //Created Thread will start here 
      this.autoReadThread.Start(fileOpen.FileName); 
     } 
    } 

    private void UpdateText(object fileName) 
    {  
     StreamReader readerStream = null; 
     while(true) 
     { 
      if (this.richTextBox1.InvokeRequired) 
      { 
       UpdateTextCallback back = new UpdateTextCallback(UpdateText); 
       this.Invoke(back, new object[] { fileName }); 
      } 
      else 
      {  
       try 
       { 
        string fileToUpdate = (string)fileName; 
        readerStream = new StreamReader(fileToUpdate); 
        richTextBox1.Text = readerStream.ReadToEnd(); 
       }  
       catch (Exception ex) { MessageBox.Show(ex.Message); }  
       finally 
       { 
        if (readerStream != null) 
        { 
         readerStream.Close(); 
         Thread.Sleep(100); 
        } 
       } 
      } 
     } 
    } 
} 

Antwort

0

Zusätzlicher Hinweis auf das, was Itay schrieb:

Du Thread.Sleep aus dem GUI-Thread ruft! Warum müssen Sie nach dem Schließen der Datei sogar eine Verzögerung vornehmen? Wenn Sie diese Verzögerung aus irgendeinem Grund benötigen (z. B. um zu vermeiden, dass Sie die Datei zu häufig lesen), sollten Sie diese Verzögerung nicht auf den GUI-Thread anwenden, da dies dazu führt, dass Ihre Anwendung nicht mehr reagiert.

EDIT: die Beantwortung Ihre Frage im Kommentar

Eine mögliche saubere Weise ein Timer gesetzt wäre, die eine BackgroundWorker alle x Sekunden aufrufen würde.

Die BackgroundWorker macht es sehr einfach, Code in einem Hintergrund-Thread auszuführen und einen Callback auf dem GUI-Thread auszuführen, wenn die Arbeit abgeschlossen ist. Und Sie müssen sich nicht direkt mit Invoke und InvokeRequired befassen.

Außerdem würde ich eine Klasse erstellen, die eine BackgroundWorker umschließt, um es einfach zu machen, Daten vom Lesen der Datei (im Hintergrundthread) an die Aktualisierung der UI (im GUI-Thread) zu übergeben.

+0

also sollte ich eine andere Klasse mit Threads erstellen, die das behandeln? – PawanS

1
  1. Sie machen die Datei aus dem GUI-Thread lesen, die eine zeitraubende Aktion. Nur die GUI-Aktualisierung sollte mit begin invoke erfolgen.
  2. Versuchen Sie nicht während while (true) zu verwenden, können Sie die FileSystemWatcher Klasse verwenden, um die Anzeige nur zu aktualisieren, wenn sich die Datei ändert (Werfen Sie einen Blick here).
+0

also wo soll ich den Thread für das Lesen von Dateien erstellen? und wenn ich FileSystemWatch benutze ich glaube nicht, dass ich Threading – PawanS

+1

implementieren muss 'FileSystemWatcher'' Changed' Ereignis, um nach Dateiänderungen zu sehen und die Datei zu lesen, wenn das Ereignis ausgelöst wird. –

+0

@Pawan: In der Tat brauchen Sie keine Threads. –