C#发布静态事件

时间:2010-02-12 20:55:14

标签: c# events

我在我正在使用的ASP.NET MVC应用程序上使用插件系统(松散地基于Rob Connery的MVC店面项目实现)。

除了执行插件方法之外,我还希望允许类提供插件可以订阅的各种事件挂钩。

我正在发布我的活动:

        #region Events

    public static event ItemAddedEventHandler ItemAdded;
    internal virtual void OnItemAdded(EventArgs e)
    {
        if (ItemAdded != null)
            ItemAdded(this, new EventArgs());
    }

    public static event LineRemovedEventHandler LineRemoved;
    internal virtual void OnLineRemoved(EventArgs e)
    {
        if (LineRemoved != null)
            LineRemoved(this, new EventArgs());
    }

    #endregion

    public delegate void ItemAddedEventHandler(object sender, EventArgs e);
    public delegate void LineRemovedEventHandler(object sender, EventArgs e);

一个示例插件:

        public EventHooks() {
        Cart.ItemAdded += new Cart.ItemAddedEventHandler(Cart_ItemAdded);
        Cart.LineRemoved += new Cart.LineRemovedEventHandler(Cart_LineRemoved);
    }

    void Cart_ItemAdded(object sender, EventArgs e) {
        _loggerService.Info("An item was added to the cart.");
    }

    void Cart_LineRemoved(object sender, EventArgs e) {
        _loggerService.Info("A line was removed from the cart.");
    }

这是一种发布和订阅这些活动的良好且线程安全的方式吗?

赞赏任何想法或建议。

由于 本

1 个答案:

答案 0 :(得分:3)

在解雇之前将你的EventHandler分配给本地var。

ItemAddedEventHandler handler = ItemAdded;

if (handler != null) 
{
   handler(this, EventArgs.Empty) 
}

检查null和触发事件之间存在竞争条件。无论如何,你最好follow the guidelines