在我的操作结束时取消订阅我的所有课堂活动
本文关键字:我的 活动 课堂 取消 操作 结束 | 更新日期: 2023-09-27 17:58:01
我有一个类,它包含几个事件,这些事件来自我的主I注册并更新我的UI
:
public class MyClass
{
public delegate void event1Delegate();
public event event1Delegate event1Handler;
public delegate void event2Delegate();
public event event2Delegate event2Handler;
public delegate void FinishWorkDelegate();
public event FinishWorkDelegate FinishWorkEventHandler;
public void DoWork()
{
// bla bla
if (FinishWorkEventHandler != null)
FinishWorkEventHandler();
}
}
从我的主UI
寄存器到我的按钮时钟事件内的事件:
private void radMenuItemSimultaneouslyPlay_Click(object sender, EventArgs e)
{
MyClass obj = new MyClass();
job.event1Handler += job_event1Handler;
job.event2Handler += job_event2Handler;
job.FinishWorkEventHandler += job_FinishWorkEventHandler;
job.doWork();
}
现在,当FinishWorkEventHandler
发射时,这意味着我的操作完成了:
private void job_OnFinishJobThreadEvent()
{
labelStatus.Text= "Finished!";
}
在这里,我想取消订阅MyClass
事件,所以我想知道是否可以将此事件从FinishWorkDelegate()
更改为FinishWorkDelegate(MyClass obj)
,并且从这里我可以访问我的对象,在这种情况下,我可以取消订阅我的事件。这样做可以吗?
这样做可以吗?
是的,为什么不呢?事实上,已经有一个名为EventHandler<T>
的内置委托,您可以使用它来代替创建新的委托:
public event EventHandler<EventArgs> FinishWorkEventHandler;
public void DoWork()
{
// bla bla
if (FinishWorkEventHandler != null)
FinishWorkEventHandler(this, EventArgs.Empty);
}
在这里,您可以用当前实例替换this
(如果您想从类外触发它),然后将其传递给事件处理程序。在事件处理程序中,您可以访问如下对象:
private void OnFinish(object sender, EventArgs e)
{
var myObject = sender as MyClass;
if (myObject != null)
{
myObject.event1Handler -= job_event1Handler;
myObject.event2Handler -= job_event2Handler;
}
}