3

我该如何解决这个问题?

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

这是我的代码:

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");
        }
    }
4

2 回答 2

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);
}

基于 Transaction() 函数的发布进行编辑

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

几个问题:

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

如果您真的想在 中保存 XML BackgroundWorker,您应该验证文件名和目录,并将Text属性保存到中间对象,然后再设置BackgroundWorker和调用RunWorkerAsync.

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

于 2012-11-20T03:33:01.340 回答
1

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

BackgroundWorker worker = sender as BackgroundWorker;


然后像这样打电话

`worker.ReportProgress(...)`
于 2012-11-20T03:34:39.787 回答