代码之家  ›  专栏  ›  技术社区  ›  marijne

转发/中继。网络事件

  •  10
  • marijne  · 技术社区  · 17 年前

    我的类有一个外部对象将订阅的事件:

    public event EventHandler<MessageReceivedEventArgs> MessageReceived;
    

    private class Listener
    {
        public void Run()
        {
             // events raised here which should be forwarded
             // to parent's MessageReceived
        }
    };
    

    我倾向于在监听器上创建一个具有相同签名的事件,并在主类中订阅它,以便在MessageReceived上引发它。这似乎有点麻烦,所以我想知道是否有一种整洁/惯用的方式来转发这样的事件。

    3 回复  |  直到 17 年前
        1
  •  25
  •   Ryan Emerle    17 年前

    您可以使用事件 add/remove accessors 以便将连接到面向外部的事件的事件“转发”给内部侦听器

    public event EventHandler<MessageReceivedEventArgs> MessageReceived {
       add { this.listener.MessageRecieved += value; }
       remove { this.listener.MessageRecieved -= value; }
    }
    

    这意味着您需要在侦听器中创建一个事件,但好处是没有其他管道来连接该事件。

        2
  •  1
  •   Jon B    17 年前

        3
  •  1
  •   Yann Schwartz    17 年前

    • 如果你不在乎让监听器的线程执行回调。只需按原样调用事件(但如果事件处理程序需要一段时间才能执行,则侦听器线程可能会被阻塞,或者如果事件处理函数抛出未经处理的异常,则只能死亡)
    • 如果你想让处理程序在与侦听器线程不同的线程中运行,但不在乎在哪个线程中,只要它不在侦听器中:在实际调用处理程序的OnXXX方法中,获取事件的调用列表,并将每个处理程序排队到线程池中。

    Roy Osherove的一篇博客文章展示了几种执行异步调用的方法: http://weblogs.asp.net/rosherove/pages/DefensiveEventPublishing.aspx