2016-04-04 20 views
-1

Dosyadaki satırları ve her satırın metin kutusunda olduğunu okurum. Etkinlik kullanıyorum ancak uygulama durdur ve tüm satırları yüklemeyi bekle. Tüm çizgiyi gösterdikten sonra. İşte kod: genel kısmi sınıf Ana Pencere: Pencere { FileReader reader = new FileReader(); public MainWindow() { InitializeComponent(); reader.OnReadLine + = Mesaj; Tavsiye için }WPF olaylarla çoklu yayın

private void Message(object sender, LineEventArgs e) 
    { 
     Dispatcher.Invoke((Action)(() => 
        { 
         textBox.Text += e.Content + "\n"; 
         textBox.Focus(); 
         textBox.SelectionStart = textBox.Text.Length; 

        })); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     TaskFactory taskFactory = new TaskFactory(); 
     var x = taskFactory.StartNew(() => reader.Read()); 
     Task.WaitAll(x); 
    } 
} 
class LineEventArgs : EventArgs 
{ 
    public string Content { get; } 

    public LineEventArgs(string content) 
    { 
     Content = content; 
    } 
} 


delegate void OnReadLineHandler(object sender, LineEventArgs e); 
class FileReader 
{ 
    public event OnReadLineHandler OnReadLine; 

    public void Read() 
    { 
     var fileStream = new FileStream("text.txt", FileMode.Open, FileAccess.Read); 
     using (var streamReader = new StreamReader(fileStream, Encoding.UTF8)) 
     { 
      while (!streamReader.EndOfStream) 
      { 
       OnRead(streamReader.ReadLine());  
      } 
     } 
    } 

    private void OnRead(string text) 
    { 
     if (OnReadLine != null) 
      OnReadLine(this, new LineEventArgs(text)); 
    } 
} 

Teşekkür

+0

'Task.WaitAll (x);' mevcut 'Dispatcher'ı engeller, böylece 'TextBox'unuz tüm satırlar okunana kadar güncellenmez. Kilitlenmeyeceğini söyleyin .. –

cevap

1

Sen sen diyerek Task.WaitAll(x) Anlamı söylüyorsun çünkü okunacak tüm dosya için beklemek UI söylüyorsun "Bu iş bitene kadar bekleyin." Bunun yerine aşağıda olduğu gibi kullanın. Ben de değiştirerek yöntem zaman uyumsuz hizmetçi

private async void button_Click(object sender, RoutedEventArgs e) 
{ 
    TaskFactory taskFactory = new TaskFactory(); 
    var x = taskFactory.StartNew(() => reader.Read()); 
    await x; 
} 

Uyarı: private void button_Click(object sender, RoutedEventArgs e)

private async void button_Click(object sender, RoutedEventArgs e) için eğer yardımcı olur deneyin ve görün ver.

+0

Teşekkürler, bu çalışır. Ama benim küçük problemim var. Satırlar sırayla görüntülenir, ancak pencere takılır ve yükleme bitene kadar hiçbir şey tıklanamaz. – bluray

+0

Bilmiyorum. Eşzamansız olarak sadece button_Click yöntemini değiştirdim. – bluray