【发布时间】:2014-02-28 02:26:30
【问题描述】:
我正在开发 WPF、C# 应用程序,我必须读取一个非常大的 CSV 文件并写入数据库。这个过程需要很长时间,所以我想至少显示一个进度条,它在接近完成时会变大。
现在,我在顶部有以下代码:
private readonly BackgroundWorker worker = new BackgroundWorker();
然后在循环中我有这个:
worker.WorkerReportsProgress = true;
worker.ReportProgress((100 * i) / 10000);
我有一个这样的私人子:
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
prgBar.Value = Math.Min(e.ProgressPercentage, 100);
}
但我没有看到进度条更新或发生任何事情,程序仍然挂起。我做错了吗?
更新:在这里http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx 尝试了 MSDN 指南,但我不知何故未能使其与该示例一起使用。我当然调整了循环部分。呵呵。它仍然保持空闲状态,没有任何更新。哎呀,我想做的就是得到一个小计数器,每次读取和添加一行时都会增加。
更新代码:
private BackgroundWorker bw = new BackgroundWorker();
public Process()
{
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
// Perform a time consuming operation and report progress.
int d = 0;
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
// Set filter for file extension and default file extension
dlg.DefaultExt = ".csv";
dlg.Filter = "CSV File (*.csv)|*.csv";
dlg.Title = "file";
// Display OpenFileDialog by calling ShowDialog method
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
// Open document
string filename = dlg.FileName;
List<String[]> fileContent = new List<string[]>();
using (FileStream reader = File.OpenRead(@filename)) // mind the encoding - UTF8
using (TextFieldParser parser = new TextFieldParser(reader))
{
using (SqlConnection conn = new SqlConnection(Classes.PublicVariables.Connection))
{
parser.Delimiters = new[] { "," };
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
string[] line = parser.ReadFields();
fileContent.Add(line);
SqlCommand comm = QUERYANDPARAMETERS
d += 1;
comm.ExecuteNonQuery();
worker.ReportProgress((d * 10));
}
}
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblCount.Content = "Complete";
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.lblCount.Content = (e.ProgressPercentage.ToString() + "%");
}
当工人运行时,我得到一个摘录。
An exception of type 'System.NullReferenceException' occurred inSolution.exe but was not handled in user code
附加信息:对象引用未设置为对象的实例。
更新3
搞定了!我所需要的只是与上面相同的代码,但是:
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
else
{
bw_DoWork(null, null);
}
在按钮按下的事件处理程序中。
【问题讨论】:
-
从数学上讲,
(100 * i) / 10000和i / 100是一样的 -
我只是想在那里填充一些东西,然后改为 9999 :P。还是不行
-
你看过这里吗:stackoverflow.com/questions/854548/… ?
-
好的,让我看看我是否可以让它与 DoWork 一起工作。我第一次使用这个
-
如果您的后台工作人员很忙,您为什么要调用 bw_DoWork?这违背了目的不是吗?
标签: c# wpf progress-bar backgroundworker