C# BackgroundWorker WPF在进度条方面遇到的困难

C# BackgroundWorker WPF在进度条方面遇到的困难,c#,wpf,progress-bar,backgroundworker,C#,Wpf,Progress Bar,Backgroundworker,我正在开发一个WPF、C#应用程序,我必须读取一个非常大的CSV文件并写入数据库。这个过程需要很长时间,所以我想至少显示一个进度条,当它接近完成时,它的大小会增加 现在,我在顶部有以下代码: private readonly BackgroundWorker worker = new BackgroundWorker(); 然后在循环中我有这样一个: worker.WorkerReportsProgress = true; worker.ReportProgress((100 * i) / 1

我正在开发一个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);
}
但我并没有看到进度条更新或任何事情发生,程序仍然挂起。我做错什么了吗

更新:在这里尝试了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() + "%");
    }
其他信息:对象引用未设置为对象的实例

更新3

开始工作了!我所需要的只是与上面相同的代码,但是:

        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
        else
        {
            bw_DoWork(null, null);
        }

在按钮按下的事件处理程序中。

这不会按原样编译,但应该让您从正确的方向开始:

private readonly BackgroundWorker worker
    = new BackgroundWorker { WorkerReportsProgress = true };

public MainWindow()
{
    InitializeComponent();

    worker.DoWork += worker_DoWork;
    worker.ProgressChanged += worker_ProgressChanged;
}

private void worker_DoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    // Do some long process, break it up into a loop so you can periodically
    //  call worker.ReportProgress()

    worker.ReportProgress(i);  // Pass back some meaningful value
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    prgBar.Value = Math.Min(e.ProgressPercentage, 100);
}

变量是否为
i
int?如果是,则
(100*i)/10000
的值将返回0,而i<100。ReportProgress方法的参数应该是一个前值。您可以将其更改为worker.ReportProgress(i),试试看。

从数学上讲,
(100*i)/10000
i/100
相同,我只是想在那里填充一些东西,然后改为9999:p。仍然没有。你在这里看过吗:?好的,让我看看我能不能让它与嫁妆一起工作。我第一次处理这个问题,如果你的后台工作人员很忙,你为什么打电话给bw_DoWork?这不符合目的,不是吗?我试试这个。谢谢格兰特
private readonly BackgroundWorker worker
    = new BackgroundWorker { WorkerReportsProgress = true };

public MainWindow()
{
    InitializeComponent();

    worker.DoWork += worker_DoWork;
    worker.ProgressChanged += worker_ProgressChanged;
}

private void worker_DoWork(object sender, DoWorkEventArgs doWorkEventArgs)
{
    // Do some long process, break it up into a loop so you can periodically
    //  call worker.ReportProgress()

    worker.ReportProgress(i);  // Pass back some meaningful value
}

private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    prgBar.Value = Math.Min(e.ProgressPercentage, 100);
}