2016-11-15 7 views
0

私は新しいWPFです。ループをimmediatellyでTextBlockに追加する方法は?

私はWPFアプリケーションでいくつかの情報を印刷しようとしています。私はtbLogと呼ばれるTextBlockにテキストを追加する簡単な方法を書いて、コンソール出力のように使いたいと思います。

今はループで使用しようとしています。 WriteLn()

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"); 
} 

効果(各ループの実行後)immediatelly見えません。ループ全体が終了した後、すべての印刷データが表示されます。 どうすれば修正できますか?

私のループで使用されるGetDayData()メソッドは、Entity Framework 6 DbContextを使用します。

+1

バックグラウンドスレッド。 WriteLnでは、Dispatcher.Invokeを使用します。それが十分明確でない場合は、サンプルコードを書くことができます。 – Evk

+0

Log4Netのようなログのメインストリームに切り替えるのはなぜですか? – Ggalla1779

+0

@エヴァークありがとう、私はこれを持っています。私は作業コードで答えを書くつもりです。 – 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

関連する問題