繁体   English   中英

Backgroundworker,没有运行进度条

[英]Backgroundworker, not running the progressbar

我该如何解决这个问题?

我期待进度条在进程中加载​​,直到进程完成

这是我的代码:

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

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

您需要通过从后台操作调用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保存,则应在设置BackgroundWorker并调用RunWorkerAsync之前验证文件名和目录,并将Text属性保存到中间对象。

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

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

BackgroundWorker worker = sender as BackgroundWorker;


然后像这样打电话

`worker.ReportProgress(...)`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM