进度栏使用背景工作者在两个不同的类之间

时间:2017-07-26 14:59:19

标签: c# namespaces backgroundworker

  1. 我在visual studio(2010版)工作。
  2. 我试图根据另一个名称空间和类中的变量,以一种形式(不同的名称空间和类)设置进度条。
  3. 您在代码中看到的ProgressPerc变量来自另一个类(我已经使用' OtherNameSpace&#39 ;.
  4. 指出了该类。
  5. 它告诉我,我无法将ProgressPerc转换为int(因为我无法转换type tot int)。
  6. 这里最优的解决方案是什么?我想用这个变量来表示模拟的进度。

    编辑:添加了ALMBerekeningen代码。这只是其中的一小部分,完整的代码太多了,不能在这里显示。

    谢谢!

    public class ALMBerekeningen
    {
        public int sim;
        public int Progress;
        public double ProgressPerc;
    
        this.ProgressPerc = this.sim / 1000;
        this.Progress = (int)Math.Round(this.Progress * 100f, 0, MidpointRounding.AwayFromZero);
    }
    
    Public class Form1: Form
    {
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
    
            ALMBerekeningen ProgressPerc;
    
            int sims;
    
            sims = (int)ProgressPerc;
    
            try
            {
                backgroundWorker1.ReportProgress(sims);
            }
    
            catch (Exception ex)
            {
                backgroundWorker1.CancelAsync();
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            lblProgress.Text = "Completed " + progressBar1.Value.ToString() + " %";
            progressBar1.Update();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

启动它时,需要将ALMBerekeningen的实例传递给后台worker,然后使用事件处理程序中的DoWorkEventArgs.Argument属性访问它:

public void Main()
{
     //The instance of the class with the variable for your progress bar
     ALMBerekeningen almBerekeningen = new ALMBerekeningen();

     BackgroundWorker bgw = new BackgroundWorker();
     bgw.DoWork += bgw_DoWork;

     //Pass your class instance in here
     bgw.RunWorkerAsync(almBerekeningen);
}


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{

    //e.Argument is the instance of the class you passed in
    var progressPerc = (ALMBerekeningen)e.Argument;

    int sims;

    sims = progressPerc.ProgressPerc;

    try
    {
        backgroundWorker1.ReportProgress(sims);
    }

    catch (Exception ex)
    {
        backgroundWorker1.CancelAsync();
        MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

顺便提一下,您显示的DoWork处理程序只会执行一次。我认为你为了这个例子而简化了它。