回调事件订阅

本文关键字:事件 回调 | 更新日期: 2023-09-27 18:03:50

我有一个带有AddWork()方法和WorkDone事件的WorkManager类。系统的其他组件将调用WorkManager.AddWork(),并且只有在它们的工作完成时才会得到通知。而不是在每个事件触发时通知每个客户端。

我正在努力寻找一个优雅的解决方案。

谢谢!

编辑:另一种看待这个问题的方式是,假设我有一个名为JobManager的类,它有一个名为OnWorkDone()的事件。我还有另外两个类需要听这个事件。

事件订阅者类1

WorkManager.OnWorkDone += WorkDoneJob1;
void WorkDoneJob1()
{
     print("Job 1 is done!");
}

事件订阅者类2

WorkManager.OnWorkDone += WorkDoneJob2;
void WorkDoneJob2()
{
     print("Job 2 is done!");
}

在这个模型中,如果jobmanager完成了job1,它将打印"job1 done"answers"job 2 done",因为所有的客户端都会收到事件触发的通知。

我只希望class1在它的工作完成时得到一个通知。

回调事件订阅

将事件放在添加到管理器的作业对象上,并在将其AddWork()添加到管理器之前订阅它。或者,使用addwork方法让管理器接受回调,并拥有一个作业和回调的字典,当作业完成时,管理器会触发这些字典。

将OnWorkDone委托更改为包含事件参数类型,该类型可以包含已完成作业的标识符,然后处理程序可以检查它是否关心该事件

public delegate void OnWorkDone(object jobIdentifer);
void WorkDoneJob1(object jobIdentifer)
{
  if (jobIdentifer == this.jobIdentifer)
  {
     print("Job 1 is done!");
  }
}

不要使用事件。只需调用类的Complete方法。

我通常不写c#,所以我的语法可能会出错。

class WorkManager {
    void DoWord {
        WorkTask task = GetNextWorkTask();
        PerformWork(task);
        task.Complete();
    }
    WorkTask GetNextWorkTask() { ... }
    void PerformWork(WorkTask task) { ... }
}
virtual class WorkTask {
    virtual void Complete;
}
class WorkTask1 : WorkTask {
    void Complete {
        print("Job 1 done.");
    }
}