【问题标题】:C# windows form progress bar with a function on background workerC# windows窗体进度条与后台工作人员的功能
【发布时间】:2011-07-28 21:50:31
【问题描述】:

我正在尝试在我的 c# excel 插件中添加进度条(MARQUEE 样式)。进度条出现,但在函数完成执行之前它不指示任何进度,这意味着它保持冻结状态。

这些是 Windows 窗体类中的函数:

    public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        for (int i = 0; i < 100; i++)
        {
            Thread.Sleep(100);

            //run in back thread
            backgroundWorker1.ReportProgress(i); 
        }
    }

    //call back method
    public void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    //call back method
    public void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    {
        progressBar1.Value = progressBar1.Maximum;
    }

这是我从添加按钮调用函数的方式:

    private void buttonClicked(object sender, RibbonControlEventArgs e)
    {
        AddInPlanView.Form1 pBar = new AddInPlanView.Form1();
        pBar.Visible = true;
        pBar.backgroundWorker1.WorkerReportsProgress = true;
        pBar.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(pBar.backgroundWorker1_ProgressChanged);
        pBar.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(pBar.backgroundWorker1_DoWork);
        pBar.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(pBar.backgroundWorker1_RunWorkerCompleted);
        pBar.backgroundWorker1.RunWorkerAsync();

        FUNCTIONTORUN();

        pBar.Visible = false;
    }

我的代码现在尝试将进度条放在后台工作人员上。我知道我应该切换它,以便 FUNCTIONTORUN() 应该在后台工作人员上,但我该怎么做呢?由于它是一个选框进度条,我根本不需要更新进度条的值,它只需要运行到FUNCTIONTORUN() 结束。请注意,FUNCTIONTORUN() 会更新 Excel 工作表的单元格。

使用 Visual Studio 设计器初始化进度条。表单类中ProgressBar对象的名称为progressbar1

【问题讨论】:

    标签: c# excel progress-bar add-in backgroundworker


    【解决方案1】:

    要启动选取框样式的进度条,请键入

    progressbar1.Style = ProgressBarStyle.Marquee;
    
    progressbar1.MarqueeAnimationSpeed = 100;
    

    停止选取框类型

    progressbar1.MarqueeAnimationSpeed= 0;
    

    来源:http://social.msdn.microsoft.com/forums/en-US/winforms/thread/9e51ad57-988e-4c17-98f0-cd2a8abec503/

    【讨论】:

      【解决方案2】:
      FUNCTIONTORUN(); // make your UI thread busy. 
      
      System.Windows.Forms.Application.DoEvents(); // might help in this case.
      

      在大多数此类情况下,DoEvent 无济于事(根据我的经验)。所以,要让进程条顺利运行是相当困难的。

      【讨论】:

        【解决方案3】:

        当后台工作人员完成时,停止进度条。

        pBar.backgroundWorker1_RunWorkerCompleted这个函数内部,只需调用进度条的Stop函数即可。

        【讨论】:

        • 虽然 FUNCTIONTORUN() 正在执行,但进度条无法正常工作
        • 啊,那是因为 FUNCTIONTORUN() 阻塞了线程。该函数应该是后台线程中的内容。
        • 是的,那我该怎么做呢?我不需要 FUNCTIONTORUN() 向进度条报告任何进度更新,因为它是一种选取框样式。
        • @Sam:您不需要从函数通知 ProgressBar 的进度,但考虑到它是我想象的长时间运行的任务,您提供“外部”的进度信息。在这种特定情况下,“外部”也是一个进度条。所以函数会报告进度,但 ProgressBar 会监听它。这里有什么问题?
        【解决方案4】:

        我相信您必须将 FUNCTIONTORUN() 放入单独的线程中,但它仍然是执行调用 ReportProgress 方法,以提高 backgroundWorker1_ProgressChanged ,您可以在其中更新您的 porgress bar 值。我想,因为我在提供的代码中没有看到它,所以您不要在代码中的某处调用ReportProgress 函数。

        已编辑:看到ReportProgress 函数。

        所以将你的函数移动到单独的线程中,并将进度条的值更新到主线程中。

        希望这会有所帮助。

        问候。

        【讨论】:

          【解决方案5】:

          您的 FUNCTIONTORUN() 阻塞了 UI 线程。
          在您的长时间运行的函数中传播一些 System.Windows.Forms.Application.DoEvents() 以处理事件(以便 UI 更新)。
          如前所述,这将更新 UI 并让应用程序响应其他事件。
          您可能希望禁用触发此长时间运行函数或其他长时间运行函数的按钮。

          【讨论】:

          • 是的,我知道,我希望它在函数运行时运行。
          • 所以在你的长时间运行的函数中加入一些System.Windows.Forms.Application.DoEvents();。它将更新用户界面!这也将防止应用程序变得无响应!
          【解决方案6】:

          您可以创建一个额外的后台工作程序,其中包含一个 DoWork,其中包含对您的 FUNCTIONTORUN() 的调用,以及一个 RunWorkerCompleted,使您的酒吧停止或不可见。然后,不调用 FUNCTIONTORUN(),而是调用 backGroundWorker2.RunWorkerAsync();

          这应该可以防止该函数冻结您的 UI。去年夏天我在做几乎完全相同的事情时遇到了这个问题,并使用后台工作程序修复了它。

          【讨论】:

            猜你喜欢
            • 2011-10-07
            • 1970-01-01
            • 2014-04-01
            • 2018-02-20
            • 2012-06-11
            • 1970-01-01
            • 2013-02-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多