如何在.NET中检查是否已订阅某个事件?

时间:2010-08-30 04:53:42

标签: c# .net events

在我的代码中,我订阅了the following event: -

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;

效果很好,当Message Queue的 Recieved Completed 事件触发时,我的代理人会处理它。

现在,在我订阅它之前,我想要检查事件是否已订阅。我这样做时出现编译时错误: -

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

活动   'System.Messaging.MessageQueue.ReceiveCompleted'   只能出现在左侧   + =或 - =

我知道这很简单......但我很难过:(有什么建议吗?

3 个答案:

答案 0 :(得分:17)

如果您需要确保只有一个订阅者,您可以使用以下代码:

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

如果UploadFolderMessageQueue.ReceiveCompletednull,那么第一行将不执行任何操作,在其他情况下,将删除事件处理程序。这意味着UploadFolderMessageQueue.ReceiveCompleted将始终只有一个订阅者(当然,如果UploadMSMQReceiveCompleted是该事件的唯一一个事件处理程序)。

答案 1 :(得分:14)

你不能从订阅者到活动这样做。只有发布商才能检查是否有订阅者。您需要使用类中的其他一些机制来跟踪订阅,如:

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

然后你可以使用它:

if(handlerAttached)
{
    //DO YOUR STUFF
}

答案 2 :(得分:0)

null测试只能在声明事件的类中执行(即UploadFolderMessageQueue类型。)

1)如果您有权访问此类的源,则可以添加一个执行测试的方法或属性,并返回一个布尔结果,您可以在订阅之前检查该结果。

2)如果你不能修改声明类,并且你只是从你自己的代码检查重新订阅,你可以在一个布尔变量中单独记录订阅,然后在尝试(重新)订阅之前检查该变量。

3)如果您无法更改声明类并且正在检查来自您自己以外的代码的订阅,则似乎没有解决方案。