在我的应用程序中,我有一个简单的EventHandler(在我的ViewModel中),定义如下:
public event EventHandler FavouriteChangedEvent;
然后,当我需要时,我用这个
开火FavouriteChangedEvent(this, null);
一切都按预期工作,但在我的应用程序中,有可点击的链接,打开webbrowser(作为单独的应用程序)。当你回到应用程序时,当我尝试运行FavouriteChangedEvent(this, null);
时,它以NullPointerException结束(从调试开始,因为FavouriteChangedEvent
实际上是空的。)
为什么?
我在互联网上找到了它并使用它
public delegate void EventHandler(object sender, string myValue);
public event EventHandler FavouriteChangedEvent = delegate { };
但它没有多大帮助。该应用程序不会下降,但在我的View类中,我在构造函数_dataContext.FavouriteChangedEvent += _dataContext_FavouriteChangedEvent;
在外出并返回应用程序后,此事件不再被触发。
答案 0 :(得分:2)
然后,当我需要时,我用这个
开火FavouriteChangedEvent(this,null);
以NullPointerException结束(从调试开始,因为FavouriteChangedEvent确实为空
这是因为没有事件处理程序尚未。
event
是一个类
一旦类声明了一个事件,它就可以像处理指定的委托类型的字段一样处理该事件。如果没有客户端将事件连接到事件,则该字段将为null,否则它将引用在调用事件时应调用的委托。因此,通常首先检查null然后调用事件来调用事件。
在上升事件之前,您必须至少检查null
:
if(FavouriteChangedEvent != null)
FavouriteChangedEvent(this, null);
注意,为了使此线程安全,您必须将事件复制到本地变量,以确保对同一事件进行null
检查和升级:
var event = FavouriteChangedEvent;
if(event != null)
event(this, null);
描述的解决方案(在构造时附加空委托)是另一种可能的线程安全解决方案。
请使用受保护的虚拟方法来引发每个事件
这就是说 - 不要像这样上升事件处理程序,而是调用受保护的虚拟方法(称为OnFavouriteChangedEvent
),这会引发事件。并且不需要在事件名称中包含单词“event”。简单说明:FavouriteChanged
。