在我的操作结束时取消订阅我的所有课堂活动

本文关键字:我的 活动 课堂 取消 操作 结束 | 更新日期: 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;
   }
}