Подписка на событие обратного вызова - PullRequest
0 голосов
/ 28 июля 2011

У меня есть класс WorkManager с методом AddWork () и событием WorkDone.Другие компоненты системы будут вызывать 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, он печатает «работа 1 выполнена» и «работа 2 выполнена», так как все клиенты получают уведомление о том, что событие произошло.

Я хочу, чтобы class1 получал уведомление только после того, как его работа завершена.

Ответы [ 3 ]

1 голос
/ 28 июля 2011

Поместите событие в объект задания, который вы добавляете в менеджер, и подпишитесь на него, прежде чем добавить AddWork () к менеджеру. Или же заставьте менеджера принять обратный вызов с помощью метода addwork и иметь словарь заданий и обратных вызовов, которые менеджер запускает при выполнении заданий.

0 голосов
/ 28 июля 2011

Не используйте события. Просто вызовите метод 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.");
    }
}
0 голосов
/ 28 июля 2011

Измените свой делегат OnWorkDone, включив в него тип аргументов события, который может включать идентификатор завершенной работы, после чего ваш обработчик может проверить, заботится ли он о событии или нет.

public delegate void OnWorkDone(object jobIdentifer);

void WorkDoneJob1(object jobIdentifer)
{
  if (jobIdentifer == this.jobIdentifer)
  {
     print("Job 1 is done!");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...