Tôi đang cố gắng để có một chuỗi riêng biệt trong ứng dụng WinForms C# bắt đầu một nhân viên nền điều khiển ProgressBar (vùng chọn). Vấn đề là khi tôi cố gắng để thiết lập thanh để nhìn thấy nó chỉ không làm gì, và tôi đã thử nhiều hình thức Invoke nhưng họ dường như không giúp đỡ.Thao tác các phần tử giao diện người dùng từ một chủ đề khác
Phương pháp sau progressBarCycle
được gọi từ một chuỗi riêng biệt.
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;
}
Tôi có thiếu điều gì đó hiển nhiên ở đây không? Các phần bình luận là những thứ khác tôi đã thử.
Tôi đặt trong ProgressChanged và RunWorkerCompleted hoàn toàn để xem nếu nó sẽ sửa chữa vấn đề của tôi. Khi tôi đã có tất cả các mã được bao gồm trong DoWork thay vào đó nó sẽ làm điều tương tự.Trạng thái hiển thị sẽ không bao giờ thay đổi, có hoặc không có lời gọi. - Oh và có lẽ đáng nói đến đây là một Marquee nên tôi không có ý định sử dụng các báo cáo tiến độ. – UncleDave
@UncleDave sau đó có vẻ như thanh tiến trình nằm trong một điều khiển khác (bảng điều khiển có thể) không hiển thị. –
Thanh tiến trình ở trên biểu mẫu đang chạy mã này, cũng là biểu mẫu bắt đầu của ứng dụng. – UncleDave