我正在處理一個包含超過10,000行的文件並將其存儲在數據庫中。處理文件通常需要2-3分鐘,所以我想顯示progressbar
。進度條在winform中凍結
問題的方案是,我progressbar
控制以及label
這是在processForm
不顯示在所有。我搜索了幾個小時,但仍然無法解決它。
這裏是我的代碼 btnApplyEOD_Click
方法,處理
private void btnApplyEOD_Click(object sender, EventArgs e)
{
string url = txtEODReport.Text;
if (url != null)
{
using (var file = new System.IO.StreamReader(url))
{
int i = 0;
linesInEOD = File.ReadAllLines(url).Count();
if (backgroundWorkerEOD.IsBusy != true)
{
progressForm = new ProgressForm();
progressForm.Show();
backgroundWorkerEOD.RunWorkerAsync();
}
while ((line = file.ReadLine()) != null)
{
string[] splitLines = line.Split('~');
switch (splitLines[0])
{
case "01":
{
BOID = splitLines[1].Trim() + splitLines[2].Trim();
break;
}
.........
}
i++;
currentLine = i;
}
}
...........
bindToGridView();
}
}
我用BackgroundWorker
和代碼BackgroundWorker_DoWork
方法的文件如下:
private void backgroundWorkerEOD_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker workerEOD = sender as BackgroundWorker;
//for (int i = 1; i <= 10; i++) //usually works but useless for this scenario
//{
// workerEOD.ReportProgress(i * 10);
// System.Threading.Thread.Sleep(500);
//}
for (int i = 1; i <= linesInEOD; i++) // doesn't work at all but it will give accurate progressbar increase
{
workerEOD.ReportProgress(100 * currentLine/linesInEOD);
}
}
BackgroundWorker_ProgressChanged
方法:
private void backgroundWorkerEOD_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressForm.Message = "In progress, please wait... " + e.ProgressPercentage.ToString() + "%";
progressForm.ProgressValue = e.ProgressPercentage;
}
您應該在'DoWork'方法中移動處理。目前你的後臺工作人員什麼都不做,因爲所有的處理都在UI線程上。 –
@IvanStoev:是的,這是問題所在。謝謝.. – TFrost