后台工作者ReportProgress没有开火

我是第一次成立后台工作人员。 它主要是在代码运行时工作,我的停止/取消按钮正在工作。 但是,我也在尝试报告更新进度条的进度,但我根本无法解决这个问题。

我从点击按钮启动代码,运行此代码:

backgroundWorker1.WorkerSupportsCancellation = true; backgroundWorker1.WorkerReportsProgress = true; backgroundWorker1.RunWorkerAsync();//this invokes the DoWork event 

我的Do_Work方法:

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; int j = 0;// Count cumulative imported files int countDupFiles = 0;// Count number of previously imported csv files int countImportedFiles = 0;// Count imported files foreach (string folderPath in csvDirList) { string[] csvFileNames = Directory.GetFiles(@folderPath, "*.csv"); frmImportCsvData.replaceAll(csvFileNames, folderPath + "\\", ""); for (int i = 0; i  0) MessageBox.Show(countImportedFiles + " files were imported."); if (countDupFiles > 0) MessageBox.Show(countDupFiles + " files were not imported. Matches all ready in Database."); } 

尝试触发这些ProgressChanged事件中的任何一个:

 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { string tbProgress = (e.ProgressPercentage.ToString() + "%"); MessageBox.Show(tbProgress + "backgroundWorker1"); importProgressBar(e.ProgressPercentage); } private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { string tbProgress = (e.ProgressPercentage.ToString() + "%"); MessageBox.Show(tbProgress + "worker"); importProgressBar(e.ProgressPercentage); } 

最后,我希望ProgressChanged事件触发此方法来更新我的进度条:

 public void importProgressBar(int i) { progressTableLayoutPanel.Visible = true;//display progress bar int percProgress = 100 * (i + 1) / csvFileCount; if (percProgress = 100) { Thread.Sleep(200); progressTableLayoutPanel.Visible = false; } } 

取消按钮代码有效,如下所示:

 private void stopImportButton_Click(object sender, EventArgs e) { backgroundWorker1.CancelAsync(); } 

我的ProgressChanged事件中的消息框永远不会显示,我的进度条永远不会显示为可见。 任何想法可能是什么问题?

检查此示例:

  BackgroundWorker bgw = new BackgroundWorker(); public Form1() { InitializeComponent(); label1.Text = ""; label2.Text = ""; } private void button1_Click_1(object sender, EventArgs e) { if (bgw == null) { bgw = new BackgroundWorker(); bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged); bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted); } bgw.WorkerReportsProgress = true; bgw.WorkerSupportsCancellation = true; bgw.RunWorkerAsync(); } void bgw_DoWork(object sender, DoWorkEventArgs e) { int total = 57; //some number (this is your variable to change)!! for (int i = 0; i <= total; i++) //some number (total) { System.Threading.Thread.Sleep(100); int percents = (i * 100) / total; bgw.ReportProgress(percents, i); //2 arguments: //1. procenteges (from 0 t0 100) - i do a calcumation //2. some current value! } } void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar1.Value = e.ProgressPercentage; label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage); label2.Text = String.Format("Total items transfered: {0}", e.UserState); } void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //do the code when bgv completes its work } } 

也许这可以帮助你解决问题......

在按钮单击事件中调用background.doWork之后,尝试将进度显示为可见。