报告不同c#类的后台工作人员的进度
本文关键字:后台 工作人员 报告 | 更新日期: 2023-09-27 17:59:15
在我的.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报告进度,这样我就可以从标签1在主屏幕上显示进度。
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。
有人能告诉我如何克服这个问题吗?
p.s-我找到了这个解决方案,但我不明白。
您可以将其作为变量传入
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;
}
}
但是我认为最好的选择是testClass
中的event
,您的Form
可以分配给它。
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=新的BackgroundWorker();
backgroundWorker1.DoWork+=新的DoWorkEventHandler(backgroundWorker.DoWork);