Wpf进度条在方法计算期间不更新

时间:2010-05-25 13:55:23

标签: wpf multithreading progress-bar

在我的应用程序中,我有一个导入选项,从.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;
        }
    }

当我查看输出时,会正确计算值,但进度条仅在完全调用方法后显示更改,因此当作业完成时。现在向用户显示反馈为时已晚。

任何人都可以帮我解决这个问题。

编辑: 我还试图在标签中显示一些文字,告诉用户正在做什么,直到方法完成后才开始使用。

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是一个使用BackgroundWorker(here's指向MSDN描述的链接的好地方)。

您可以为ProgressChanged事件注册一个事件处理程序(在执行读取行的过程中,您会定期引发该事件处理程序)。