【问题标题】:Callback event subscription回调事件订阅
【发布时间】:2011-07-27 22:28:04
【问题描述】:

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

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

谢谢大家!

编辑: 另一种看待这个问题的方法是,假设我有一个名为 JobManager 的类和一个名为 OnWorkDone() 的事件。 我还有 2 个其他班级需要收听此事件。

事件订阅者类 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 在其作业完成时收到通知。

【问题讨论】:

  • 你能把你当前的代码贴出来让我们看看吗?
  • 这是一大堆代码,所以我试图在上面简化它。
  • 更新了一些伪
  • 这在 Web 应用程序中是行不通的,除非您竭尽全力确保这些对象仍然存在。一旦请求完成,页面就消失了,无法访问。
  • 对不起,我之前应该提到更多细节。

标签: c# asp.net events callback


【解决方案1】:

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

【讨论】:

  • 嗯。因此,将委托作为参数传递给 AddWork() 调用,然后 WorkManager 可以启动作业并附加客户端委托和它自己的委托。当作业触发事件时,会通知经理和客户吗?我喜欢这个主意!!!您会提供一个关于传递委托并将其附加到事件处理程序等的代码示例吗?谢谢
  • 传入回调是要走的路!谢谢吉米和其他人!
【解决方案2】:

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

public delegate void OnWorkDone(object jobIdentifer);

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 2010-10-10
      • 1970-01-01
      相关资源
      最近更新 更多