0

私の肩書きが私の質問を混乱させるかもしれませんが、そうではありません。

やるべきタスクのリストとProgressBar. タスクのリストをループするとき、次のように進行状況を表示したいProgressBar:

        double percentage;
        for(int i = 0; i < tasks.Count; i++)
        {
            percentage = (double)i + 1 / (double)tasks.Count;
            this.Invoke((MethodInvoker)delegate
            {
                progressBar1.Value = (int)Math.Round(percentage * 100);
            });
            // Do tasks here...
        }

progressBar1したがって、20 個のタスクの値を 5にしたい((1 / 20) * 100)場合、再度ループすると 10、15 などの値になります。私が現在使用している方法は正しく機能しません。最初のタスクでprogressBar1は値が 0 で、再度ループすると値が 100 になります。私が達成しようとしていることを行う方法はありますか?

ありがとう。

4

2 に答える 2

4
for(int i = 0; i < tasks.Count; i++)
{
    double percentage = (double)(i + 1) / (double)tasks.Count;
    Action<double> update = p => 
    {
        progressBar1.Value = (int)Math.Round(p * 100);
    };
    this.Invoke(update, percentage);
    // Do tasks here...
}
于 2012-08-14T07:46:55.357 に答える
0

コードは基本的に機能するはずですが、UI が時間内に更新されていないと思います (つまり、コンテキストの切り替えが発生せず、完了してから制御を返すだけです)。私は C#、マルチスレッド、UI コーディングに関する経験があまりないので、ここから少しずれているかもしれません。

ここで私がやろうとしているのは、タスク スレッド内でタスクを実行し始めたら、しばらくスリープすることです (基本的には 0 秒でも問題ありません)。

少しトピックから外れています: 私はあなたがそれを少し複雑にしすぎていることに言及したいと思います. プログレス バーの最大値をタスクの数に設定し、その値を 1 ずつ増やします。これにより、そのループ内の古い数学がかなり削除されます。

編集:ええ、ダーリンの答えに気づきました。彼は正しいです。括弧も欠落しているため、パーセンテージの計算がうまくいきません。

ただし、そのようにすると、精度エラーのために合計パーセンテージがわずかにずれてしまう可能性があることに注意してください (タスクの数によってはそれほど重要ではありませんが、正確に 100% に到達できない場合があります)。

于 2012-08-14T07:47:01.823 に答える