2010-11-19 16 views
0

を実行している間、私は次のコードを持っている:更新UIタスク

 progressBar1.Minimum = 0; 
     progressBar1.Maximum = Results.Count; 

     foreach (MyClass cls in Results) 
     {     
       progressBar1.Value += 1; 

       // Go to DB and get large quantity of data 
       cls.GetHistoryData(); 

     } 

私が何をしたいのですが何をprogressBar1のが正しく更新されるように、別のスレッドに処理を移すです。私はarticleを見つけました。これは、プログレスバーでInvokeメソッドを使用できるはずだが、1つのようには見えないことを意味します。

答えて

2

を。 WPFバインディングエンジンはこれを自動的に行います。

<ProgressBar Value={Binding Progress} /> 

そして、あなたのスレッドで:

foreach (MyClass cls in Results) 
{     
     // databinding will automatically marshal to UI thread 
     this.Progress++; 
     cls.GetHistoryData(); 
} 

ほとんどの場合、これはDispatcher.InvokeまたはBackgroundWorkerを使用して、独自に整列化よりもはるかにクリーンでエラーが発生しにくいです

+0

これは理想的なソリューションのようです。残念ながら、それは動作していないようです。私は進歩がクラスレベルの変数として設定される必要があると仮定しています(それ以外の場合はそれを認識しません)。何か他に必要なことはありますか? –

+0

あなたの設定によって異なります。あなたはUserControl/Windowにプロパティを追加し、このポストのようにバインドすることができます:http://goo.gl/ZMcnp さらに理想的には、MVVMを使うと、 CurrentProgressプロパティを持つProgressDialogViewModelクラスのDataTemplateと、MessageプロパティとTiltleプロパティなどのその他のものがあります。 DataTemplateでは、それらのプロパティに対してバインドします。 – bitbonk

+0

+1 - ベストソリューション。しかし、 "Progress"の依存関係プロパティを実装する代わりに、INotifyPropertyChangedを使用します。 –

2

BackgroundWorkerクラスをチェックする必要があります。進行をサポートし、スレッド間の通信を適切に処理します。

0

次のような新しいスレッドを開始します:あなたは、データプロパティにプログレスバーをバインドする場合は、手動でスレッドコンテキストを切り替える必要はありません

Thread t1 = new Thread(methodnametocall); 
    t1.start(); 

void methodnametocall() 
{ 
    this.Invoke((MethodInvoker)delegate 
    { 

     control to update; 
    } 
}); 
0

この

progressBar1.Minimum = 0; 
progressBar1.Maximum = Results.Count; 

foreach (MyClass cls in Results) 
{ 
    ThreadPool.QueueUserWorkItem((o) => 
      { 
       progressBar1.Dispatcher.BeginInvoke(
        (Action) (() => progressBar1.Value += 1)); 
       cls.GetHistoryData(); 
      }); 
} 
を試してみてください
0

リンク先の記事はwinformsの例ですが、yoあなたはWPFアプリケーションを作っています。あなたの場合は、代わりにDispatcherクラスを使用して、コントロールのDispatcherプロパティを調べる必要があります。

関連する問題