したがって、最初に、 application.DoEventsは、自分が何をしているのかを本当に理解していて、これが適切な使用法であり、正しく使用していることを確認しない限り、避ける必要があります。ここではどちらも当てはまらないと確信しています。
次に、フェードの速度をどのように制御していますか?基本的には、コンピューターをできるだけ早くフェードさせ、操作(およびバックグラウンドプロセス)に固有のオーバーヘッドに依存して、コンピューターの処理時間を長くします。それは本当に良いデザインではありません。フェードがマシン間で一貫するように、最初からフェードにかかる時間を指定することをお勧めします。を使用しTimer
て、適切な設定間隔でコードを実行し、フェードの期間中(を使用せずにDoEvents
)UIスレッドがブロックされないようにすることができます。
以下を変更duration
してフェードにかかる時間を変更し、を変更しsteps
て「途切れ途切れ」を判断します。100に設定したのは、それが事実上、以前のコードで行われていたことだからです。実際には、おそらくそれほど多くは必要なく、途切れ始める直前まで下げることができます。(ステップが低いほど、パフォーマンスが向上します。)
さらに、このようなパフォーマンスについてはそれほど心配する必要はありません。フェードは、約1秒またはそれ以下のスケールで測定する必要があるものであり(人間がそれを認識できるようにするため)、最近のどのコンピューターでも、これよりはるかに多くのことができます。一瞬でそれも面白くありません。これは、1秒間の計算に関して、CPUを実質的に消費しないため、最適化を試みることは、間違いなくマイクロ最適化です。
private void button1_Click(object sender, EventArgs e)
{
int duration = 1000;//in milliseconds
int steps = 100;
Timer timer = new Timer();
timer.Interval = duration / steps;
int currentStep = 0;
timer.Tick += (arg1, arg2) =>
{
Opacity = ((double)currentStep) / steps;
currentStep++;
if (currentStep >= steps)
{
timer.Stop();
timer.Dispose();
}
};
timer.Start();
}