【问题标题】:Backgroundworker, not running the progressbarBackgroundworker,不运行进度条
【发布时间】:2012-11-20 03:29:06
【问题描述】:

我该如何解决这个问题?

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

这是我的代码:

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

【问题讨论】:

    标签: c# progress-bar backgroundworker


    【解决方案1】:

    运行时应该如何知道您的进程走了多远?

    您需要通过后台操作调用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 文件。运行时可能会浪费更多时间在线程之间编组数据,而不是简单地将文件写入磁盘。只需在按钮单击事件处理程序中完成您的工作。

    【讨论】:

    • 谢谢,我更新了我的问题我把什么交易功能包含在哪里我应该把它知道吗?我只是在创建 xml 时放了 4 个数据,但实际上它有 15 个数据。 :)
    【解决方案2】:

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

    BackgroundWorker worker = sender as BackgroundWorker;
    


    然后像这样调用

    `worker.ReportProgress(...)`
    

    【讨论】:

    • 谢谢,我更新了我的问题我把什么交易功能包含在哪里我应该把它知道吗?我只是在创建 xml 时放了 4 个数据,但实际上它有 15 个数据。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多