gpt4 book ai didi

c# - 订阅事件的后台 worker

转载 作者:行者123 更新时间:2023-11-30 21:01:17 25 4
gpt4 key购买 nike

我有一个表格。表单有一个逻辑类来做某事。我希望表单在完成此操作时能够响应,因此我创建了一个 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));
}
}

问题是,当我反复触发操作时,更新被多次发布。检查了一下,connection对象有多个worker订阅了publish事件。所以看来我在这里制造了 2 个问题:
1. 单个事件被多次发布。2. 我在连接对象中保留对后台工作人员的引用,一旦他们完成工作就应该将其处理掉。

解决此问题的最佳方法是什么?我可以在工作人员完成工作后删除其订阅,但它看起来很脏。有没有更好的方法来处理这种情况?

最佳答案

您应该在工作人员完成后取消订阅该事件。 IE。您应该在代码的某处添加以下内容:

logicObject.UpdatePublished -= connection_UpdatePublished;

这将从注册处理 UpdatePublished 事件的委托(delegate)列表中删除您的事件处理程序。

这个 SO 问题/答案解释了您可能如何使用事件意外地造成内存泄漏: Why and How to avoid Event Handler memory leaks?

关于c# - 订阅事件的后台 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14319505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com