WPF使用调度程序更新进度条

5

我正在尝试使用调度程序更新进度条,但是无法确定在哪里放置dispatcher.Invoke以及传递什么参数。

我正在尝试导入文件,并需要使用进度条向用户显示已导入的文件数量。

因此,我有一个委托:

public delegate void DelegateA(ProgressClass progressClass);

我正在调用委托并传递要调用的函数。

DelegateA(FunctionA);

因此,在导入每个文件时,它会调用FunctionA。

private void FunctionA(ProgressClass progressClass)
{
    **//Put dispatcher.invoke here?**
    progressbar.updateprogress(progressclass);
    progressbar.show();
}

progressclass有两个属性,分别设置进度条的值(已处理多少)和要处理的总项目数。

我不知道在InvokeMethod(THreadPriority, delegate method)中传递哪个委托方法?

如果有什么不清楚的地方,请原谅。


progressbar.updateprogress(progressclass); progressbar.show(); 这段代码具体是做什么的? - Haris Hasan
进度条是一个窗口,其中包含进度条控件。更新进度函数实际上使用进度类属性设置值和最大值。显示函数显示进度条窗口。 - alice7
3个回答

8
如果您正在尝试从某些非UI线程更新UI,您可以像这样做...
//here progress bar is a UIElement
progressBar.Dispatcher.BeginInvoke(
           System.Windows.Threading.DispatcherPriority.Normal
           , new DispatcherOperationCallback(delegate
                   {
                       progressBar1.Value = progressBar1.Value + 1;
                       //do what you need to do on UI Thread
                       return null;
                   }), null);

这段代码来自一篇关于如何从后台线程更新UI的好文章


谢谢,它对我有效,但是只有将'value'强制转换为int才行。但在wpf中,Progressbar.Value是double类型的。你知道为什么吗? - Civa

2

我假设您已经启动了一个后台线程来导入文件。您应该考虑使用BackgroundWorker来完成此操作,它是轻量级的,并且具有内置的机制来报告进度(例如,使用事件来控制ProgressBar)。

如果您想要在处理中使用新的线程,只需声明一个委托,添加一个目标函数,并调用Dispatcher.BeginInvoke:

Dispatcher.BeginInvoke(DispatcherPriority.Normal, new UpdateProgressDelegate(UpdateProgress), myProgressData);

//...

private delegate void UpdateProgressDelegate(ProgressClass progressClass);

void UpdateProgress(ProgressClass progressClass)
{
    progressbar.updateprogress(progressclass);
    progressbar.show(); 
}

0
这是一个带有进度条的CSV读取器代码:
私有void InsertCSVRecords(DataTable csvdt) {
        connection();
        //creating object of SqlBulkCopy    
        SqlBulkCopy objbulk = new SqlBulkCopy(con);
        //assigning Destination table name    
        objbulk.DestinationTableName = "membershipsample";
        //Mapping Table column    
        objbulk.ColumnMappings.Add("GPO_NAME", "GPO_NAME");
        objbulk.ColumnMappings.Add("Ship_To", "Ship_To");
        objbulk.ColumnMappings.Add("Location_Type", "Location_Type");
        objbulk.ColumnMappings.Add("Bill_To", "Bill_To");
        objbulk.ColumnMappings.Add("GPO_CUST_ID", "GPO_CUST_ID");
        objbulk.ColumnMappings.Add("PRI_AFL_FLG", "PRI_AFL_FLG");
        objbulk.ColumnMappings.Add("MCK_GPO_PGM_TYPE", "MCK_GPO_PGM_TYPE");
        objbulk.ColumnMappings.Add("MCK_GPO_PGM_SUB_TYPE", "MCK_GPO_PGM_SUB_TYPE");
        objbulk.ColumnMappings.Add("MCK_MBRSH_EFF_DT", "MCK_MBRSH_EFF_DT");
        objbulk.ColumnMappings.Add("CUST_MAILING_NAME", "CUST_MAILING_NAME");
        objbulk.ColumnMappings.Add("ADDRESS1", "ADDRESS1");
        objbulk.ColumnMappings.Add("ADDRESS2", "ADDRESS2");
        objbulk.ColumnMappings.Add("CITY", "CITY");
        objbulk.ColumnMappings.Add("STATES", "STATES");
        objbulk.ColumnMappings.Add("POSTAL_CODE", "POSTAL_CODE");
        objbulk.ColumnMappings.Add("ACCT_MGR_NAME", "ACCT_MGR_NAME");

        con.Open();
        objbulk.WriteToServer(csvdt);
        con.Close();


    }

    private void button_Click(object sender, RoutedEventArgs e)
    {


        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();



        // Set filter for file extension and default file extension 
        dlg.DefaultExt = ".csv";
        dlg.Filter = "CSV Files (*.cvs)|*.csv|Excel Files (*.xlsx)|*.xlsx";

        // dlg.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
        //dlg.Filter = "CSV Files (*.csv)";

        // Display OpenFileDialog by calling ShowDialog method 
        Nullable<bool> result = dlg.ShowDialog();


        // Get the selected file name and display in a TextBox 
        if (result == true)
        {
            // Open document 
            string filename = dlg.FileName;
            textBox.Text = filename;
            // readCSV(filename);
        }


    }
    private void readCSV(string Path)
    {
        using (var reader = new StreamReader(Path))
        {
            List<string> listA = new List<string>();
            List<string> listB = new List<string>();
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(';');

                if (!String.IsNullOrEmpty(values[0]))
                    listA.Add(values[0]);
                if (values.Length > 2 && !String.IsNullOrEmpty(values[1]))
                    listB.Add(values[1]);
            }
        }

    }

    private void Bk_DoWork(object sender, DoWorkEventArgs e)
    {


        // txtStatus.Visibility = System.Windows.Visibility.Visible;
        DispatcherTimer timer = new DispatcherTimer();
        //Creating object of datatable  
        DataTable tblcsv = new DataTable();
        //creating columns  
        tblcsv.Columns.Add("GPO_NAME");
        tblcsv.Columns.Add("Ship_To");
        tblcsv.Columns.Add("Location_Type");
        tblcsv.Columns.Add("Bill_To");
        tblcsv.Columns.Add("GPO_CUST_ID");
        tblcsv.Columns.Add("PRI_AFL_FLG");
        tblcsv.Columns.Add("MCK_GPO_PGM_TYPE");
        tblcsv.Columns.Add("MCK_GPO_PGM_SUB_TYPE");
        tblcsv.Columns.Add("MCK_MBRSH_EFF_DT");
        tblcsv.Columns.Add("CUST_MAILING_NAME");
        tblcsv.Columns.Add("ADDRESS1");
        tblcsv.Columns.Add("ADDRESS2");
        tblcsv.Columns.Add("CITY");
        tblcsv.Columns.Add("STATES");
        tblcsv.Columns.Add("POSTAL_CODE");
        tblcsv.Columns.Add("ACCT_MGR_NAME");

        // DispatcherTimer timer = new DispatcherTimer();
        string url=string.Empty;
        this.Dispatcher.Invoke(() => { url = textBox.Text; });
        string ReadCSV = File.ReadAllText(url);
        //spliting row after new line  url
        int i = 0;
        DataTable dt = GetMemberTable();
        var worker = sender as BackgroundWorker;
        int rows = ReadCSV.Split('\n').Length / 100;
        int totalRows = ReadCSV.Split('\n').Length;
        foreach (string csvRow in ReadCSV.Split('\n'))
        {

            i++;
           // Thread.Sleep(1000);
                   worker.ReportProgress((i/rows + 1), string.Format("This is new one"));
            this.Dispatcher.Invoke(() => { label.Content = i + " rows have been added or updated"; });
            bool Check = (csvRow.Length > 0) ? Exist(csvRow.Split(',')[1].ToString(), dt) : true;
            if (i > 1 && !string.IsNullOrEmpty(csvRow))
            {
                //Adding each row into datatable  

                int count = 0;
                if (!Check)
                {
                    tblcsv.Rows.Add();
                    foreach (string FileRec in csvRow.Split(','))
                    {

                        if (count >= 15)
                        {
                            tblcsv.Rows[tblcsv.Rows.Count - 1][count] = FileRec;
                        }
                        else
                        {
                            tblcsv.Rows[tblcsv.Rows.Count - 1][count] = FileRec;
                            count++;
                        }
                        //                  //Calling insert Functions 
                        //                  Dispatcher.Invoke(
                        //new System.Action(() => downloadProgress.Value = i)
                        //);


                    }

                }


            }


        }
        if (tblcsv.Rows.Count > 0)
        {
            InsertCSVRecords(tblcsv);
        }
        worker.ReportProgress(100, "Done");
        this.Dispatcher.Invoke(() => { textBox.Text = string.Empty; });
        //textBox.Text = string.Empty;
        this.Dispatcher.Invoke(()=> { label.Content = totalRows + " rows have been added or updated"; });
        this.Dispatcher.Invoke(() => { button1.IsEnabled = false; });
        //button1.IsEnabled = false;
    }
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        BackgroundWorker bk = new BackgroundWorker();
        bk.RunWorkerCompleted += Bk_RunWorkerCompleted;
        bk.WorkerReportsProgress = true;
        bk.DoWork += Bk_DoWork;
        bk.ProgressChanged += Bk_ProgressChanged;
        bk.RunWorkerAsync();


    }

    private void Bk_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.Dispatcher.Invoke(() => { downloadProgress.Value = e.ProgressPercentage; });
        //downloadProgress.Value = e.ProgressPercentage;
    }

    //private void Bk_DoWork(object sender, DoWorkEventArgs e)
    //{
    //    AddData();
    //    var worker = sender as BackgroundWorker;
    //    worker.ReportProgress(0, string.Format("This is new one"));
    //    for(int i=0;i<10;i++)
    //    {
    //        Thread.Sleep(1000);
    //        worker.ReportProgress((i + 1) * 10, string.Format("This is new one"));
    //    }

    //    worker.ReportProgress(100, "Done");

    //}

    private void Bk_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("All Done");
        this.Dispatcher.Invoke(() => { downloadProgress.Value = 0; });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接