在我的应用程序中,我有一个导入选项,从.csv或.txt文件中读取信息并将其写入数据库。为了测试,我只使用200-300行数据。在方法的开头,我计算要读取的对象/行的数量。每次将对象写入数据库时,我想更新我的进度条。我就是这样做的:
private void Update(string path)
{
double lines = 0;
using (StreamReader reader = new StreamReader(path))
while ((reader.ReadLine()) != null)
lines++;
if (lines != 0)
{
double progress = 0;
string lijn;
double value = 0;
List<User> users = new List<User>();
using (StreamReader reader = new StreamReader(path))
while ((line = reader.ReadLine()) != null)
{
progress++;
value = (progress / lines) * 100.0;
updateProgressBar(value);
try
{
User user = ProcessLine(lijn);
}
catch (ArgumentOutOfRangeException)
{ continue; }
catch (Exception)
{ continue; }
}
return;
}
else
{
//non relevant code
}
}
要更新我的进度条,我正在检查是否可以像这样更改进度条的ui:
delegate void updateProgressbarCallback(double value);
private void updateProgressBar(double value)
{
if (pgbImportExport.Dispatcher.CheckAccess() == false)
{
updateProgressbarCallback uCallBack = new updateProgressbarCallback(updateProgressBar);
pgbImportExport.Dispatcher.Invoke(uCallBack, value);
}
else
{
Console.WriteLine(value);
pgbImportExport.Value = value;
}
}
当我查看输出时,会正确计算值,但进度条仅在完全调用方法后显示更改,因此当作业完成时。现在向用户显示反馈为时已晚。
任何人都可以帮我解决这个问题。
编辑: 我还试图在标签中显示一些文字,告诉用户正在做什么,直到方法完成后才开始使用。
提前致谢。
答案 0 :(得分:2)
这是一个使用BackgroundWorker(here's指向MSDN描述的链接的好地方)。
您可以为ProgressChanged事件注册一个事件处理程序(在执行读取行的过程中,您会定期引发该事件处理程序)。