WinFormsでのスレッド化の経験はほとんどありません。プログレスバーを100に設定し、2秒間スリープしてから、プログレスバーを非表示にしようとしています。
私は持っています:
public void ProgressBarTimerStop()
{
if (!AnyWorkersBusy())
{
if (InvokeRequired)
{
Invoke((MethodInvoker)delegate
{
ProgressBarTimer.Stop();
Thread.Sleep(1000);
Application.DoEvents();
Thread.Sleep(1000);
StatusToolStripProgressBar.Visible = false;
StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Minimum;
});
}
else
{
ProgressBarTimer.Stop();
StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Maximum;
Thread.Sleep(1000);
Application.DoEvents();
Thread.Sleep(1000);
StatusToolStripProgressBar.Visible = false;
StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Minimum;
}
}
}
私が経験している現在の問題では、InvokeRequiredはfalseです。
私が電話をかけるとき:
StatusToolStripProgressBar.Value = StatusToolStripProgressBar.Maximum;
ウォッチウィンドウに設定された値が表示されますが、これを反映するようにGUIが更新されていません。すぐに2秒間スリープすると、スリープする前にGUIが更新されません。
事前にsleepを呼び出さずにApplication.DoEvents()を呼び出すと、何もしないように見えます。
スリープ状態の場合は、DoEvents(GUIの更新)を呼び出してから、スリープ状態に戻ります。これは正しいですが、私のコードは凶悪なように感じます。
ここで重要な概念を誤解していますか?
編集:ProgressBarTimerStopは、「RunWorkerCompleted」イベントハンドラーを介してのみ呼び出されます。
これを試しましたが、効果がありませんでした。
StatusToolStripProgressBar.GetCurrentParent().Refresh();