报告来自不同类c#的进度backgroundworker
在我的.NET C#项目中,我使用“BackgroundWorker”来调用另一个类中的方法。 以下是我的主要表格的源代码
public partial class Form1 : Form { public Form1() { InitializeComponent(); } testClass t1 = new testClass(); private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { t1.changevalue(1000); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { label1.Text += Convert.ToString(e.ProgressPercentage); } private void button1_Click(object sender, EventArgs e) { backgroundWorker1.RunWorkerAsync(); } }
并在我的项目中名为“testClass.cs”的单独类文件中包含以下代码。 我想从此类向BackgroundWorker报告进度,以便我能够从label1显示main中的进度。
class testClass { private int val; public int changevalue(int i) { for (int j = 0; j < 1000; j++) { val += i + j; //from here i need to preport the backgroundworker progress //eg; backgroundworker1.reportProgress(j); } return val; } }
但我不允许从“testClass”访问BackgroundWorker。
有人可以告诉我们如何克服这个问题吗?
ps-我找到了这个解决方案 ,但我不明白。
您可以将其作为变量传递
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; } }
但我认为最好的选择是您的Form
可以分配给testClass
中的一个event
。
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; } }
我刚刚遇到同样的问题(我的长时间运行过程是数据库恢复),并通过在另一个类中引发事件以类似的方式解决它,但后来我的订阅者只是充当了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(); }
这节省了必须使用:
base.Invoke((Action)delegate
如果表单意外关闭,我认为这会导致问题?
我在上面的代码中错过了这个吗?:
backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.DoWork + =新的DoWorkEventHandler(backgroundWorker1_DoWork);