【问题标题】:How can I check if an event has been subscribed to, in .NET?如何在 .NET 中检查事件是否已被订阅?
【发布时间】:2011-04-05 14:32:33
【问题描述】:

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

UploadFolderMessageQueue.ReceiveCompleted += UploadMSMQReceiveCompleted;

效果很好,当消息队列的 Recieved Completed 事件触发时,我的委托会处理它。

现在,我想在订阅之前检查该事件是否已被订阅。执行此操作时出现编译时错误:-

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

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

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

【问题讨论】:

  • 您应该尝试设计您的代码,以便您以可预测的方式订阅和退订。

标签: c# .net events


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您不能从订阅者到事件执行此操作。只有发布者可以检查是否有订阅者。您将需要使用班级中的其他一些机制来跟踪订阅,例如:

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

      那么你可以使用这个:

      if(handlerAttached)
      {
          //DO YOUR STUFF
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 2016-08-04
        • 2016-05-01
        相关资源
        最近更新 更多