report progress backgroundworker from different class c#

前端 未结 3 1221
星月不相逢
星月不相逢 2020-12-05 11:29

In my .NET C# project I have used a \"BackgroundWorker\" to call a method in a different class. The following is the source-code of my main form

public parti         


        
相关标签:
3条回答
  • 2020-12-05 12:18

    I've just had this same issue (my long running process is a database restore), and solved it in a similar way by raising an event in the other class, but then had my subscriber to that event just act as a wrapper to backgroundWorker1.ReportProgress().

    private void DBRestoreProgressHandler(DataAccess da, DataAccess.DatabaseRestoreEventArgs e)
        {
            backgroundWorker1.ReportProgress(e.RestoreProgress);
        }
    
    private void backgroundWorker1_ReportProgress(object sender, ProgressChangedEventArgs e)
        {
            someLabel.Text = e.ProgressPercentage.ToString();
        }
    

    This saved having to use:

    base.Invoke((Action)delegate
    

    Which I think can then cause problems if the form closes unexpectedly?

    0 讨论(0)
  • 2020-12-05 12:21

    You could just pass it in as a variable

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        t1.changevalue(1000, sender as BackgroundWorker);
    }
    
    
    class testClass
    {
        private int val;
        public int changevalue(int i, BackgroundWorker bw)
        {
            for (int j = 0; j < 1000; j++)
            {
                val += i + j;
                bw.ReportProgress(i);
                //from here i need to preport the backgroundworker progress
                //eg; backgroundworker1.reportProgress(j);
            }
            return val;
        }
    } 
    

    But I think the best option would be an event in the testClass that your Form can assign to.

    public partial class Form1 : Form
    {
        private BackgroundWorker backgroundWorker1;
        private testClass t1 = new testClass();
    
        public Form1()
        {
            InitializeComponent();
    
            // subscribe to your event
            t1.OnProgressUpdate += t1_OnProgressUpdate;
        }
    
        private void t1_OnProgressUpdate(int value)
        {
            // Its another thread so invoke back to UI thread
            base.Invoke((Action)delegate
            {
                label1.Text += Convert.ToString(value);
            });
        }
    
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            t1.changevalue(1000);
        }
    
        private void button1_Click_1(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
    
    }
    
    class testClass
    {
        public delegate void ProgressUpdate(int value);
        public event ProgressUpdate OnProgressUpdate;
    
        private int val;
        public int changevalue(int i)
        {
            for (int j = 0; j < 1000; j++)
            {
                val += i + j;
    
                // Fire the event
                if (OnProgressUpdate != null)
                {
                    OnProgressUpdate(i);
                }
            }
            return val;
        }
    } 
    
    0 讨论(0)
  • 2020-12-05 12:24

    Am i missing this in the above code ?:

    backgroundWorker1 = new BackgroundWorker();

    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);

    0 讨论(0)
提交回复
热议问题