ゴールデンショベル候補ですが、それでも同様の問題に遭遇したので、ここで解決策を共有したいと思います。
一般に、計算が複雑なため、非同期で実行されるメソッドがあります。入力パラメータの1つは、プログレスバー自体です。
はnull許容型であるためProgressBar
、メソッドを呼び出すときに必須ではありません。
メソッド内で、ディスパッチャでプログレスバーを進めます。多くの場合、メソッドはプログレスバーを所有する他のスレッドで実行されます。プログレスバーのnullの可能性を処理するために、nullable
演算子を使用します。
private string MyMethod(int input, ProgressBar progressBar)
{
while(!done)
{
// Do the hard work.
progressBar?.Dispatcher.Invoke(() => progressBar.Value++);
}
}
ここで、メソッドを呼び出す前にプログレスバーを設定するMaxiumim
必要があり、予想される長さに設定する必要があります。
プログレスバーを進める必要があるたびに、ディスパッチャに電話をかけるのが非常に非効率になっていると言う人もいるかもしれません。はい、私はそれに同意します、しかしそれはすべて私たちが通過する必要があるステップの数に依存します。そのため、簡単なベンチマークを実行しました。
私の場合、300,000(30万)を超えるステップがありました(各ステップは、データを文字列にフォーマットし、その文字列をファイルに書き込むことでした)。プログレスバーを更新せずにメソッドを実行することが私の参考になりました。
- 各ステップでプログレスバーを更新すると、実行時間が2,000%以上長くなりました(20倍長くなりました)
- 10ステップごとにプログレスバーを更新すると、実行時間が250%以上長くなりました(2.5倍長くなりました)
- プログレスバーを100ステップごとに更新すると、実行時間が約15%長くなりました(約1/8長くなります) 。
- 1000ステップごとにプログレスバーを更新すると、実行時間が約3%長くなりました(わずかな違い)
プログレスバーの幅が240ピクセルの場合、プログレスバーの最大値は約300になり、それに応じて更新すると、パフォーマンスが著しく低下することなく、非常にスムーズなアニメーションが得られます。