2016-11-15 24 views
0

我是新的WPF。如何立即將文本追加到循環中的TextBlock?

我試圖在我的WPF應用程序中打印一些信息。我寫了一個簡單的方法,將文本附加到TextBlock,名爲tbLog,我想將它用作控制檯輸出。

private void WriteLn(string text) 
{ 
    tbLog.Text += text + Environment.NewLine; // tbLog is a TextBlock 
} 

現在我試圖在循環中使用它。

foreach (var day in listOfDays) 
{ 
    Stopwatch watch = new Stopwatch(); 
    watch.Start(); 
    double[] aData = GetDayData(data, day); // I'm using EF6 DbContext here 
    alData.Add(aData); 
    WriteLn("Processing " + day.Date.Date + " took " + watch.Elapsed.TotalSeconds + "s"); 
} 

WriteLn()影響是不可見的immediatelly(每個循環運行後)。所有打印的數據在整個循環結束後顯示。 我該如何解決這個問題?

我的GetDayData()循環中使用的方法使用實體框架6 DbContext

+1

你必須在一個單獨的運行循環後臺線程。在WriteLn中,使用Dispatcher.Invoke。如果這還不夠清楚,我可以編寫一個示例代碼。 – Evk

+0

你爲什麼不切換到Log4Net這樣的主流日誌記錄 – Ggalla1779

+0

@Evk謝謝,我明白了。我會用工作代碼寫一個答案。 – Kamil

回答

0

所以,感謝Evk我修好了我這樣的代碼:

'WriteLn' 部分:

private void WriteLn(string text) 
{ 
    tbLog.Dispatcher.BeginInvoke(new Action(() => 
    { 
     tbLog.Text += text + Environment.NewLine; 
    })); 
} 

環路部分:

Thread t = new Thread(() => 
     { 
      foreach (var day in listOfDays) 
      { 
       Stopwatch watch = new Stopwatch(); 
       watch.Start(); 
       double[] aData = GetDayData(data, day); 
       alData.Add(aData); 
       WriteLn("Processing " + day.Date.Date + " took " + watch.Elapsed.TotalSeconds + "s"); 

       id++; 
      } 
     }); 

t.Start(); 
+0

考慮使用Task.Run而不是新線程 – 3615