ฉันกำลังลองทดสอบง่ายๆ เพื่อใช้ BackgroundWorker ในแอปของฉัน ฉันเห็นว่าผู้ปฏิบัติงานเบื้องหลังกำลังดำเนินการอยู่ แต่ด้วยเหตุผลบางประการ เธรดหลักจึงได้รับการแจ้งเตือนความคืบหน้า
ฉันคงขาดอะไรบางอย่างที่ธรรมดามากที่นี่ ใครช่วยชี้ให้เห็นว่าฉันผิดตรงไหน?
นี่คือรหัสสำหรับการทดสอบอย่างง่ายของฉัน:
namespace TestBackgroundWorker
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
progressBar1.Maximum = 100;
progressBar1.Minimum = 0;
progressBar1.Value = 0;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
int progress = 0;
while (true)
{
Thread.Sleep(1000);
System.Diagnostics.Debug.WriteLine("worker: progress={0}", progress);
worker.ReportProgress(progress);
progress = (progress + 10) % 100;
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("main: process progress={0}", e.ProgressPercentage);
progressBar1.Value = e.ProgressPercentage;
}
}
}
และนี่คือสิ่งที่ฉันได้รับจากหน้าต่างเอาท์พุต มันแสดงให้เห็นว่าคนงานกำลังตื่นขึ้นมาและกำลังทำสิ่งนั้นอยู่ แต่เธรดหลักไม่ได้รับการอัปเดตความคืบหน้าใดๆ:
worker: progress=0
worker: progress=10
worker: progress=20
worker: progress=30
worker: progress=40
worker: progress=50
worker: progress=60
worker: progress=70
worker: progress=80
worker: progress=90
worker: progress=0
worker: progress=10
worker: progress=20
worker: progress=30
worker: progress=40
worker: progress=50
worker: progress=60
worker: progress=70
worker: progress=80
The thread '<No Name>' (0x1e84) has exited with code 0 (0x0).
worker: progress=90
worker: progress=0
worker: progress=10
worker: progress=20
worker: progress=30
worker: progress=40
worker: progress=50
worker: progress=60
worker: progress=70
worker: progress=80
worker: progress=90
worker: progress=0
worker: progress=10
worker: progress=20
worker: progress=30
worker: progress=40
worker: progress=50
worker: progress=60
worker: progress=70
worker: progress=80
worker: progress=90
worker: progress=0
worker: progress=10
worker: progress=20
worker: progress=30
worker: progress=40
worker: progress=50
The thread 'vshost.RunParkingWindow' (0x2760) has exited with code 0 (0x0).
The thread '<No Name>' (0x29c8) has exited with code 0 (0x0).
The program '[3528] TestBackgroundWorker.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).