后台工作器,未运行进度条。

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");
        }
    }
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元素时引发异常。

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

此外,我认为您的Transaction方法不会太耗时,以至于需要后台线程。即使是相对较旧的计算机也能比您眨眼更快地创建和保存一个包含15个元素的XML文件。运行时可能会浪费更多时间在线程之间传递数据,而不是将文件直接写入磁盘。只需在按钮单击事件处理程序中完成您的工作即可。

谢谢,我更新了我的问题。我放了交易函数包含的内容,现在应该把它放在哪里呢?我只在创建 XML 时放了 4 个数据,但实际上有 15 个数据。 :) - GrayFullBuster

1

需要一些参考 BackgroundWorker 实例的方法。在实例化类时,将引用传递给它。
可以如下实例化:

BackgroundWorker worker = sender as BackgroundWorker;


然后像这样调用

`worker.ReportProgress(...)`

谢谢,我更新了我的问题。我放了交易函数包含的内容,现在应该把它放在哪里?我只在创建 XML 中放了 4 个数据,但实际上有 15 个数据。 :) - GrayFullBuster

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