2014-02-06 39 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

謝謝,它的作品! –