3

を使用してプログレスバーを進めようとしていBackgroundWorkerます。最終的な目標は身元調査の進行状況を表示することですが、最初に簡単なシミュレーションを実行して進行状況バーを知りたいと思います。これはコードです:

    public MainWindow()
    {
        InitializeComponent();

        worker = new BackgroundWorker(); // variable declared in the class
        worker.WorkerReportsProgress = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.Title += " DONE";
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int j = 0; j <= 100; j++)
        {
            worker.ReportProgress(j);
            Title += j.ToString();
            Thread.Sleep(50);
        }
    }

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

しかし、実行すると、プログレスバーを変更せずに最後までスキップします。ステップバイステップでデバッグすると、最後のステップはですworker.ReportProgress(j);。その後、controlはプログラムに戻り、worker_RunWorkerCompleted呼び出されます。なんで?

4

2 に答える 2

1

を変更しようとする場合はUI content、を呼び出す必要がありますUI Dispatcher。あなたcan't modify UI objects from background thread。あなたの行をこれらに置き換えてください-

App.Current.Dispatcher.Invoke((Action)delegate()
        {
            Title += j.ToString();
        });

App.Current.Dispatcher.Invoke((Action)delegate()
        {
            Title = "Done";
        });
于 2012-11-11T16:14:38.853 に答える
1

ワーカーを実行するのを忘れました:

     worker.RunWorkerAsync();
于 2012-11-11T16:08:34.220 に答える