2012-02-06 7 views
1

を更新し、BackgroundWorkerのMVVMを設定します。は、私はStartCommandのクラスを持っているプログレスバー

public class StartCommand : ICommand 
{ 
    public void Execute(object parameter) 
    { 
     //Fill Listview1 
     ... 
     //Here I want to increase the Progressbarvalue 

     //Fill Listview2 
     ... 
     //Here again and so far..  
    } 
} 

にスタートボタンをクリックすると、実行されるコマンドを実行し、私のMainWindow.xaml(もprogressBarだ場合)。

私は今何をしたいのですか?は、リストビューがロードされている間、これらの場所(コードを見てください)でプログレスバーを更新しています。 バックグラウンドワーカーを設定するにはどうすればよいですか?

は、私はそのような何かを試してみました:

public class StartCommand : ICommand 
    { 
     MainWindow mainWindow; 

     public StartCommand(MainWindow mainWindow) 
     { 
      this.mainWindow = mainWindow 
     } 

     public void Execute(object parameter) 
     { 
      //Fill Listview1 
      ... 
      mainWindow.backgroundWorker1.RunWorkerAsync(10); 

      //Fill Listview2 
      ... 
      mainWindow.backgroundWorker1.RunWorkerAsync(20);  
     } 
    } 

メインウィンドウ:

public partial class MainWindow : Window 
{ 
    BackgroundWorker backgroundWorker1; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     InitializeBackgroundWorker(); 
    } 

    private void InitializeBackgroundWorker() 
    { 
     backgroundWorker1.DoWork += 
      new DoWorkEventHandler(backgroundWorker1_DoWork); 
     backgroundWorker1.RunWorkerCompleted += 
      new RunWorkerCompletedEventHandler(
     backgroundWorker1_RunWorkerCompleted); 
     backgroundWorker1.ProgressChanged += 
      new ProgressChangedEventHandler(
     backgroundWorker1_ProgressChanged); 
    } 


    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     e.Result = UpdateProgressBar((int)e.Argument, worker); 
    } 

    private int UpdateProgressBar(int value, BackgroundWorker worker) 
    { 
     worker.ReportProgress(value); 
     return Convert.ToInt32(progressBar.Value); 
    } 

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 

    } 

    private void backgroundWorker1_ProgressChanged(object sender,ProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 
} 

}

ザッツ(私は見当がつかない原因これは、唯一のいくつかのコピー/貼り付け配置で動作しませんそれを達成する方法については、WPFのThreadsで初めての作業です)。しかし、たぶんあなたが探しているもののより良い光景を得たかもしれません。

答えて

3

あなたは選択する必要があります:すべてのリストビューをロードするために1人のバックグラウンドワーカーを使用するか、

現在、バックグラウンドワーカーは、前のジョブが完了する前に別のジョブで作業を開始しようとしています。

すぐにこれを修正するには:DoWorkハンドラにリストビューをロードするコードをすべて入れてください。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    // fill listview1 
    worker.ReportProgress(percentageDone); 
    // fill listview2 
    worker.ReportProgress(percentageDone); 
    // fill listview3 
    worker.ReportProgress(percentageDone); 
} 

複数Backgroundworkersを使用するには、複数のBackgroundworkersを作成します。

var bw1 = new BackgroundWorker(); 
bw1.DoWork += ...; 
bw1.RunAsync(...); 
var bw2 = new BackgroundWorker(); 
bw2.DoWork += ...; 
bw2.RunAsync(...); 
var bw3 = new BackgroundWorker(); 
bw3.DoWork += ...; 
bw3.RunAsync(...); 
+0

[BackgroundWorker.WorkerReportsProgress](http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.workerreportsprogress.aspx)プロパティを「true」に設定する必要があることに注意してください'ReportProgress'を有効にします。 – Clemens

+0

問題は、コードを分離したいということです。つまり、MainWindowのBackgroundcodeに "ListViewFilling"を書きたくないということです。私はまだクラスStartCommandでそれをしたい..どのListViewFillingのように見える: 'viewModel.MissingTables = schemaComparer.GetSchemaModifications (viewModel.FirstSchemaToCompare、viewModel.SecondSchemaToCompare);' – eMi

+0

良い!あなたができることは、ViewModelに背景作業者を置くことです。 –

2

このすべては、 "充填リストビュー" は実際に何を意味するかに依存します。データを取得するためにデータベースに行くなら、間違いなくバックグラウンドスレッド上にあるはずです。しかし、既にデータを持っていて、リストビューを作成する必要がある場合は、BackgroundWorkerはまったく役に立たないでしょう。それは事態を悪化させます。これは、ListViewにアクセスするためにUIスレッドにマーシャリングする必要があるためです。

ListViewに追加するデータがたくさんあり、その間ずっとUIを応答させたい場合は、データを別々のディスパッチャメッセージでチャンクに追加する必要があります。チャンクが追加されたら、別のメッセージをキューに入れて次のチャンクを追加します。これにより、ディスパッチャは、リストが入力されている間に他のメッセージを処理する時間を与えます。

+0

私はデータベースからデータを取得していますが、同時に7つのListviewを書きますが、それほど長い時間はかかりません。約3〜7秒ですので、UIは本当に反応的でなければなりません。 – eMi

関連する問題