2014-02-06 36 views
1

工作时我已阅读这篇文章,但它并没有帮助我:后台工作不正常工作做在WPF

Background worker does not work properly in WPF

我正在使用WPF(C#)后台工作,我想当阅读文本文件时,它显示“加载....”,但它不显示。我的代码是:

private delegate void upmdlg(); 
    private delegate void upmdlg2(); 

    private void callmetoread() 
    { 
     StreamReader str = new StreamReader("C:\\test.txt"); 
     while (!str.EndOfStream) 
     { 
      richTextBox1.AppendText(str.ReadToEnd()); 
     } 
    } 

    private void callmetochangelabel() 
    { 
     label1.Foreground = Brushes.Red; 
     label1.Content = "loading ...."; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     label1.Foreground = Brushes.Yellow; 
     label1.Content = "idle"; 

     BackgroundWorker bg = new BackgroundWorker(); 

     bg.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      upmdlg mo = new upmdlg(callmetochangelabel); 
      label1.Dispatcher.BeginInvoke(mo, DispatcherPriority.Normal); 

      upmdlg mo2 = new upmdlg(callmetoread); 
      richTextBox1.Dispatcher.BeginInvoke(mo2, DispatcherPriority.Normal); 

     }; 
     bg.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs arg) 
     { 
      label1.Foreground = Brushes.Green; 
      label1.Content = "done ...."; 
     }; 

     bg.RunWorkerAsync(); 
    } 

感谢您的任何帮助。

回答

2

SynchronizationContext.CurrentPost尝试执行UI代码。 BTW

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     label1.Foreground = Brushes.Yellow; 
     label1.Content = "idle"; 

     var context = SynchronizationContext.Current; 

     BackgroundWorker bg = new BackgroundWorker(); 

     bg.DoWork += (o, args) => 
     { 

      context.Post(state => callmetochangelabel(),null); 
      context.Post(state => callmetoread(), null); 
     }; 
     bg.RunWorkerCompleted += (o, args) => 
     { 
      label1.Foreground = Brushes.Green; 
      label1.Content = "done ...."; 
     }; 

     bg.RunWorkerAsync(); 
    } 

: 这个工作对我来说很好的帖子,描述的SynchronizationContext是如何工作的:It's All About the SynchronizationContextUnderstanding SynchronizationContext

+0

谢谢,我测试了自己的答案,但它不工作。 –

+1

您能否将DoWork方法体更改为: 'context.Post(state => callmetochangelabel(),null); Thread.Sleep(1000); context.Post(state => callmetoread(),null); ' 确保'callmetochangelabel'方法未被执行? – DimaS

+1

谢谢,它的作品! –