回调事件订阅

时间:2011-07-27 22:28:04

标签: c# asp.net events callback

我有一个带有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,它将打印“job 1 done”和“job 2 done”,因为所有客户都会收到该事件被触发的通知。

我只希望class1在作业完成时收到通知。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

public delegate void OnWorkDone(object jobIdentifer);

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

答案 2 :(得分:0)

不要使用活动。只需调用类的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.");
    }
}