在我的代码中,我订阅了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' 只能出现在左侧 + =或 - =
我知道这很简单......但我很难过:(有什么建议吗?
答案 0 :(得分:17)
如果您需要确保只有一个订阅者,您可以使用以下代码:
UploadFolderMessageQueue.ReceiveCompleted -= UploadMSMQReceiveCompleted;
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;
如果UploadFolderMessageQueue.ReceiveCompleted
为null
,那么第一行将不执行任何操作,在其他情况下,将删除事件处理程序。这意味着UploadFolderMessageQueue.ReceiveCompleted
将始终只有一个订阅者(当然,如果UploadMSMQReceiveCompleted
是该事件的唯一一个事件处理程序)。
答案 1 :(得分:14)
你不能从订阅者到活动这样做。只有发布商才能检查是否有订阅者。您需要使用类中的其他一些机制来跟踪订阅,如:
UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;
bool handlerAttached=true;
然后你可以使用它:
if(handlerAttached)
{
//DO YOUR STUFF
}
答案 2 :(得分:0)
null测试只能在声明事件的类中执行(即UploadFolderMessageQueue类型。)
1)如果您有权访问此类的源,则可以添加一个执行测试的方法或属性,并返回一个布尔结果,您可以在订阅之前检查该结果。
2)如果你不能修改声明类,并且你只是从你自己的代码检查重新订阅,你可以在一个布尔变量中单独记录订阅,然后在尝试(重新)订阅之前检查该变量。
3)如果您无法更改声明类并且正在检查来自您自己以外的代码的订阅,则似乎没有解决方案。