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의 상태는 호출의 유무에 관계없이 변경되지 않습니다. - 아, 그리고 이것은 아마도 Marquee라고 언급 할 가치가 있습니다. 그래서 진도 보고서를 사용하지 않을 것입니다. – UncleDave
@UncleDave 그러면 진행률 표시 줄이 보이지 않는 다른 컨트롤 (패널 일 가능성이 있음) 안에 있음을 알 수 있습니다. –
진행률 표시 줄은 응용 프로그램의 시작 양식이기도 한이 코드를 실행하는 폼에 있습니다. – UncleDave