我有一个表格。该表单有一个执行某些操作的逻辑类。我希望表单在完成此操作时能够响应,因此我创建了一个 BackgroundWorker 对象。我还想从逻辑类获取更新到表单。我想使用 BackgroundWorker 的进度更新事件。
所以我将表单上的一个方法订阅到worker.ProgressChanged。
public class MyForm : Form
{
private LogicClass logicObject;
public void StartOperation()
{
BGWorkerBase worker = new BGWorkerBase(logicObject);
worker.DoWork += new DoWorkEventHandler(DoOperation);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OperationComplete);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerAsync();
}
public void DoOperation()
{
logicObject.DoSomething();
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Update form
}
}
我创建了一个自定义的 Backgroundworker,它订阅了逻辑类的更新事件并调用 ProgressChanged 事件:
public class BGWorkerBase : BackgroundWorker
{
public BGWorkerBase(LogicClass logicObject)
{
// connection is the logic class. it has an update event
logicObject.UpdatePublished += new EventHandler(connection_UpdatePublished);
this.WorkerReportsProgress = true;
}
// Here I invoke the backgroundworker OnProgressChangedEvent
private void connection_UpdatePublished(object sender, EventArgs e)
{
OnProgressChanged(new ProgressChangedEventArgs(0, e));
}
}
问题是当我反复触发操作时,更新被多次发布。我检查并发现连接对象有多个订阅了发布事件的工作人员。所以看来我在这里创造了两个问题:
1. 一个事件被多次发布。2. 我在连接对象中保留了对后台工作人员的引用,一旦他们完成工作就应该将其处理掉。
解决此问题的最佳方法是什么?我也许可以在工人完成工作时删除它的订阅,但它看起来很脏。有没有更好的方法来处理这种情况?