1

プログレスバーにバグがあり、どうすればよいかわかりません。

0 から 100 まで実行される for サイクル (またはループ) があり、進行状況を報告するだけで、100 ミリ秒スリープします。

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {
        backgroundWorker.ReportProgress(i);
        Thread.Sleep(100);
    }
}

そして、progresschanged イベント ハンドラー メソッドには、他のいくつかのものに加えて、2 つの "if" があります。

if (matchProgressBar.Value == 50)
{
    OnHalfTime(); //listBox1.Add("Halftime!");
}
if (matchProgressBar.Value == 100)
{
    OnFullTime(); //listBox1.Add("Full time!");
}

2 つの「不明な」メソッドは、listBox に行を追加することです。最初のケース: "Halftime!"; そして2番目:「フルタイム!」。そして、両方の行の後に同じ "Thread.Sleep(5000);" があります。//ハーフタイムに休憩が必要だからです:) //

しかし問題は、listBox1 は既に更新されているのに、プログレスバーが更新される前に GUI が 5 秒スリープすることです。(そのため、プログラムは 49% と 99% で 5 秒間スタックします。)

質問: これを修正するために何かできることはありますか?

4

1 に答える 1

1

Sleep()UI スレッドで呼び出すべきではありません。バックグラウンド スレッドを一時停止してから再開することを意図している場合は、再配置することを検討してください。

プログレス バーを強制的に更新するには、 と を呼び出しInvalidate()ますUpdate()。例:

matchProgressBar.Invalidate();
matchProgressBar.Update();

編集 (@Servy コメントの説明):

明確にするために、上記の2つの代替案を提供しました。この問題を解決するための推奨される方法はSleep()、UI スレッドの を削除し、代わりにバックグラウンド スレッドが適切なタイミングで「一時停止」を行うようにすることです。2 番目の代替手段は、UI スレッドで呼び出す前に使用Invalidate()するUpdate()ことSleep()で、この特定のインスタンスで機能する可能性がありますが、実際にはハックであり、メンテナンスの観点からはうまく機能しません (つまり、将来のコード変更で壊れる傾向があります)。他の望ましくない属性も持っています。可能であれば、最初の方法を使用してください。

于 2012-11-26T21:43:34.537 に答える