【发布时间】:2018-10-19 04:11:07
【问题描述】:
BackgroundWorker 的进度条在执行某些任务时不会更新。我想要达到的是进度条在遍历 DirectoryInfo 中的每个文件时移动。假设我们有 20 个“.sql”文件,而第一个文件完成时应该是 5%、10% 等等。 这是我的代码。
private void CSV_Click(object sender, RoutedEventArgs e)
{
try
{
btnExtract.IsEnabled = false;
workerextract.RunWorkerAsync();
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
}
private void workerextract_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
try
{
this.Dispatcher.Invoke(() =>
{
DirectoryInfo di = new DirectoryInfo(txtQueryfolder.Text);
files = di.GetFiles("*.sql").Count();
currentfile = 0;
foreach (FileInfo fi in di.GetFiles("*.sql"))
{
// Open the text file using a stream reader.
using (StreamReader sr = new StreamReader(fi.FullName))
{
// Read the stream to a string, and write the string to the console.
string line = sr.ReadToEnd();
//System.Windows.MessageBox.Show(line);
ExtractToCSV(line, System.IO.Path.GetFileNameWithoutExtension(fi.Name));
currentfile++;
}
int percentage = (currentfile + 1) * 100 / files;
workerextract.ReportProgress(percentage);
}
});
}
catch(Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
}
private void workerextract_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
progressBarExtract.Value = e.ProgressPercentage;
}
private void workerextract_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
btnExtract.IsEnabled = true;
System.Windows.MessageBox.Show("CSV Data extraction finished!");
}
我发现了
private void workerextract_ProgressChanged(对象发送者, System.ComponentModel.ProgressChangedEventArgs e)
在 100% 结束时调用一次。 还有,
private void workerextract_RunWorkerCompleted(对象发送者, RunWorkerCompletedEventArgs e)
从来没有打电话,因为我没有看到最后的消息框。
所以,我认为我在这里做错了什么,请您指导我正确的方式吗?
【问题讨论】:
-
为什么会被多次调用?您只报告一次进度 - 最后。您根本没有报告循环中的进度。
-
我已经修改了我的代码,即使在循环内部也只调用了一次。
-
您全力以赴创建一个后台工作线程 - 然后要求
Dispatcher将您的大部分代码返回 移到 UI 线程上。你为什么要这么做? -
所以停止从后台工作代码访问 UI 对象。或者,如果您“必须”访问 UI 对象,只需用
Dispatcher.Invoke包裹 那些行,而不是 整个 循环。 -
你为什么要生成一个后台工作者只是为了在 UI 线程上运行它???
this.Dispatcher.Invoke。这违背了整个目的
标签: c# backgroundworker