Как я могу проверить, подписано ли событие в .NET? - PullRequest
5 голосов
/ 30 августа 2010

В какой-то момент моего кода я подписываюсь на следующее событие : -

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;

прекрасно работает, и когда запускается событие Получено завершено очереди сообщений, мой делегат обрабатывает его.

Теперь я хочу ПРОВЕРИТЬ, чтобы увидеть, подписано ли на событие, прежде чем подписаться на него. Я получаю ошибку времени компиляции, когда я делаю: -

// Compile Time Errors...
if (UploadFolderMessageQueue.ReceiveCompleted == null)
    {
        UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;
        UploadFolderMessageQueue.Formatter = 
            new XmlMessageFormatter(new[] {typeof (string)});
    }

Событие 'System.Messaging.MessageQueue.ReceiveCompleted' может появляться только на левой стороне из + = или - =

Я знаю, что это смущающе просто ... но я в тупике :( Есть предложения?

Ответы [ 3 ]

17 голосов
/ 30 августа 2010

Если вам нужно убедиться, что есть только один подписчик, вы можете использовать следующий код:

UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted;
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;

Если UploadFolderMessageQueue.ReceiveCompleted равно null, то первая строка ничего не изменит, в противном случае обработчик события будет удален. Это означает, что UploadFolderMessageQueue.ReceiveCompleted всегда будет иметь только одного подписчика (конечно, если UploadMSMQReceiveCompleted - единственный обработчик этого события).

14 голосов
/ 30 августа 2010

вы не можете сделать это от подписчика на событие. Только издатель может проверить, есть ли подписчики. Вам нужно будет отслеживать подписку, используя другой механизм в вашем классе, например:

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;
bool handlerAttached=true;

тогда вы можете использовать это:

if(handlerAttached)
{
    //DO YOUR STUFF
}
0 голосов
/ 30 августа 2010

Нулевой тест можно выполнить только внутри класса, который объявляет событие (т. Е. Тип UploadFolderMessageQueue.)

1) Если у вас есть доступ к источнику этого класса, вы можете добавить метод или свойство, которыевыполняет тестирование и возвращает логический результат, который вы можете проверить перед подпиской.

2) Если вы не можете изменить декларирующий класс и проверяете только повторную подписку из своего собственного кода, вы можете отдельно записатьподписка в логической переменной, а затем проверьте эту переменную перед попыткой (повторной) подписки.

3) Если вы не можете изменить декларирующий класс и проверяете подписки из кода, отличного от вашего, решение, похоже, не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...