私は、WinForms C#アプリケーションで別スレッドを使用して、ProgressBar(マーキー)を制御するバックグラウンドワーカーを開始しようとしています。問題は、私がバーを目に見えるようにしようとすると、何もしません。そして、私はInvokeの多くのフォームを試しましたが、助けてくれないようです。別のスレッド内からUI要素を操作する
以下のメソッドprogressBarCycle
が別のスレッドから呼び出されます。
BackgroundWorker backgroundWorker = new BackgroundWorker();
public void progressBarCycle(int duration)
{
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.RunWorkerAsync(duration);
}
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
worker.ReportProgress(0);
DateTime end = DateTime.Now.AddMilliseconds((int)e.Argument);
while (DateTime.Now <= end)
{
System.Threading.Thread.Sleep(1000);
}
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = false;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = false));
// else progressBar1.Visible = false;
}
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (!this.IsHandleCreated)
this.CreateHandle();
statusStrip1.Invoke((MethodInvoker)delegate
{
progressBar1.Visible = true;
});
// if (!this.IsHandleCreated)
// {
// this.CreateHandle();
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
// }
// else
// if (InvokeRequired) this.Invoke((MethodInvoker)(() => progressBar1.Visible = true));
// else progressBar1.Visible = true;
}
私はここで何かが分かりませんか?コメントセクションは、私が試した他のものです。
純粋に私の問題を解決するかどうかをProgressChangedとRunWorkerCompletedに入れました。 DoWorkにすべてのコードが含まれていたら、まったく同じことが起こります。Visibleの状態は、呼び出しの有無にかかわらず、決して変更されません。 - ああ、それはおそらく、これはマーキーであることに言及する価値があるので、私は進捗報告を使用するつもりはありません。 – UncleDave
@UncleDaveこれは、プログレスバーが表示されない別のコントロール(パネルかもしれない)の中にあるように聞こえる。 –
プログレスバーはこのコードを実行するフォーム上にあります。これはアプリケーションの開始フォームです。 – UncleDave