如何将进度更改事件链接到进度条
本文关键字:链接 事件 | 更新日期: 2023-09-27 18:09:56
我有一个windows窗体应用程序运行一个类的方法BackgroundWorker。
我想添加窗体的进度条来显示进度。
在类方法中我有一个foreach循环所以我希望每个循环发送表单事件
显示当前百分比
我是这样做的:
public partial class Form1 : Form
{
Parsser inst;
public Form1()
{
InitializeComponent();
inst = new Parsser();
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
}
private void button2_Click(object sender, EventArgs e)
{
if (this.textBox1 != null & this.textBox2 != null)
{
if (backgroundWorker1.IsBusy != true)
{
// Start the asynchronous operation.
backgroundWorker1.RunWorkerAsync();
}
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
inst.init(this.textBox1.Text, this.textBox2.Text);
inst.ParseTheFile();
System.Windows.Forms.MessageBox.Show("Parsing finish successfully");
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.progressBar1.Value = e.ProgressPercentage;
}
}
}
在课堂上我这样做-
public Parsser()
{
bgReports = new BackgroundWorker();
bgReports.WorkerReportsProgress = true;
}
public void ParseTheFile()
{
Lines = File.ReadAllLines(FilePath);
this.size = Lines.Length;
foreach (string line in Lines)
{
bgReports.ReportProgress(allreadtchecked/size);
从某些原因它不工作任何想法?
将BackgroundWorker
的引用传递给Parsser
,然后使用该引用调用ReportProgrss
方法
BackgroundWorker worker;
public Parsser(BackgroundWorker bg)
{
worker = bg;
}
public void ParseTheFile()
{
Lines = File.ReadAllLines(FilePath);
this.size = Lines.Length;
foreach (string line in Lines)
{
worker.ReportProgress(allreadtchecked/size);
您正在Parsser类构造函数中创建一个复制的BackgroundWorkder实例。试试下面的
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
inst.init(this.textBox1.Text, this.textBox2.Text);
inst.ParseTheFile(backgroundWorker1);
System.Windows.Forms.MessageBox.Show("Parsing finish successfully");
}
在解析器类中
public Parsser()
{
//Don't initialize backgroundworker here.
}
public ParseTheFile(BackgroundWorker bgWorker)
{
bgReports = bgWorker;
.....
}
将lambda或方法传递给工作方法:
在形式:public void Run()
{
myParse.DoWork(a => UpdateProgressBar(a.Progress));
}
private void UpdateProgressBar(int progress) { ... }
在解析器:public void Parse(Action<ProgressArgs> onProgress)
{
// do your job
// invoke onProgress whenever needed
onProgress(current / total * 100);
}
您需要设置后台worker通过DoWorkEventHandler
工作。此外,看起来你的部分类的每一半都在使用自己的BackgroundWorker。你需要使用相同的引用。你有bgreports和backgroundWorker1.
backgroundWorker1.DoWork += MyMethod;
// ......
private void MyMethod(object sender, DoWorkEventArgs e)
{
}
还有,为什么要测试文本框是否为空?您是否试图测试其文本字符串内容为空?如果是,我将使用String.IsNullOrEmpty.
我认为这里更好的设计是让你的"解析器"(请修复拼写并确定该类用于操作代码的类型/用途)定义你的消费者类将订阅的自己的事件。解析器不应该负责异步运行自身。使用者应该可以选择同步运行还是异步运行。在这些情况下,可以定义和订阅自定义进程事件(同样,可选的)。