Search code examples
c#wpfbackgroundworker

ProgressBar with BackgroundWorker in WPF


I have an WPF Application where one of the tasks in this application will be printing a telerik report which takes a little time.

I have solved the screen freeze by using BackgroundWorker, But I want showing printing process in ProgressBar, I have read some of examples but all of them talks about FOR loops and passes the integer number to the ProgressBar which is dose not work with my case.

How can I do that if this possible?

Here's my BackgroundWorker DoWork:

 void _printWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        _receiptReport = new Receipt(_invoice.InvoiceID, _invoice.ItemsinInvoice.Count);
        printerSettings = new System.Drawing.Printing.PrinterSettings();
        standardPrintController = new System.Drawing.Printing.StandardPrintController();
        reportProcessor = new Telerik.Reporting.Processing.ReportProcessor();
        reportProcessor.PrintController = standardPrintController;
        instanceReportSource = new Telerik.Reporting.InstanceReportSource();
        instanceReportSource.ReportDocument = _receiptReport;
        reportProcessor.PrintReport(instanceReportSource, printerSettings);
    }

Thanks in advance


Solution

  • When you define your BackgroundWorker, enable reporting progress:

    worker.WorkerReportsProgress = true;
    worker.ProgressChanged += _printWorker_ProgressChanged;
    

    Add a ProgressBar to your window. Set the Maximum to however many "updates" you want to report:

    <ProgressBar x:Name="ProgressBar1" Maximum="8" />
    

    Then increase the Value of the ProgressBar via the BackgroundWorker.ReportProgress method, after each line of code in your DoWork event:

    void _printWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var worker = (BackgroundWorker)sender;
    
        worker.ReportProgress(0);
        _receiptReport = new Receipt(_invoice.InvoiceID, _invoice.ItemsinInvoice.Count);
        worker.ReportProgress(1);
        printerSettings = new System.Drawing.Printing.PrinterSettings();
        ...
        ...
        worker.ReportProgress(6);
        instanceReportSource.ReportDocument = _receiptReport;
        worker.ReportProgress(7);
        reportProcessor.PrintReport(instanceReportSource, printerSettings);
        worker.ReportProgress(8);
    }
    
    private void _printWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        ProgressBar1.Value = e.ProgressPercentage;
    }
    

    You'll also need to make the ProgressBar visible prior to calling RunWorkerAsync(), then hide it in the RunWorkerCompleted event.