Backgroundworker,没有运行进度条

时间:2012-11-20 03:29:07

标签: c# progress-bar backgroundworker

如何解决此问题?

我希望在进程中加载​​进度条,直到进程完成

这是我的代码:

private void btnProcess_Click(object sender, EventArgs e)
    {
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
        backgroundWorker.DoWork += backgroundWorker_DoWork;

        backgroundWorker.RunWorkerAsync();
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //start transaction
        DoTransaction();
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar.Value = e.ProgressPercentage;
    }

我的交易功能:

private void DoTransaction()
    {
        string pathIdentifier;
        pathIdentifier = func.checkthePathFile();
        if (pathIdentifier == null)
        {
            MessageBox.Show("Path has no yet been specified!");
        }
        else
        {
            //create xml base from user inputs
            XElement transactXML = new XElement("Transaction",
                new XElement("CardNumber", txtCardNum.Text.Trim()),
                new XElement("ExpireDate", txtExpDate.Text.Trim()),
                new XElement("Cardtype", txtCardType.Text.Trim())
                );

            //save xml to a file
            transactXML.Save(pathIdentifier + "/sample.xml");
        }
    }

2 个答案:

答案 0 :(得分:3)

运行时如何知道您的进程有多远?

您需要通过后台操作调用backgroundWorker.ReportProgress来告诉它。这里没有魔法。

MSDN:http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

只要有意义,就将您的流程细分为有意义的块和ReportProgress

public void DoTransaction()
{
    part1();
    backgroundWorker.ReportProgress(25);

    part2();
    backgroundWorker.ReportProgress(50);

    part3();
    backgroundWorker.ReportProgress(75);

    part4();
    backgroundWorker.ReportProgress(100);
}

基于发布交易()功能进行编辑

如果您对编写多线程程序没有信心,那么即使借助于试图从您那里抽象出一些细节的BackgroundWorker,也不要尝试编写多线程程序。

一些问题:

您提供的Transaction()方法尝试启动MessageBox并从后台线程中读取各种控件的Text属性。这会导致问题,因为当从创建它们的线程以外的线程访问UI元素时,运行时通常会抛出异常。

如果你真的想在BackgroundWorker中进行XML保存,你应该验证文件名和目录,并在设置Text之前将BackgroundWorker属性保存到中间对象并致电RunWorkerAsync

此外,在我看来,您的Transaction方法不会耗费足够的时间来真正保证后台线程。即使是相对较旧的PC也能够以比闪烁更快的速度创建和保存15个元素的XML文件。运行时可能会浪费更多时间在线程之间编组数据,而不是简单地将文件写入磁盘。只需在按钮单击事件处理程序中完成工作。

答案 1 :(得分:1)

需要对BackgroundWorker实例的一些引用。在实例化时传递对类的引用 像这样实例化

BackgroundWorker worker = sender as BackgroundWorker;


 然后像这样打电话

`worker.ReportProgress(...)`