2012-02-24 73 views
2

由于某种原因,我的事件抛出一个空错误。我没有看到任何错误。为什么我的事件抛出一个空错误?

这里是事件

public delegate void connectionSuccess(bool success); 
public event connectionSuccess Connection; 

然后在功能我有这个女巫抛出空错误

Connection(true); 

编辑*功能调用连接功能

Server.Connection += onConnection; 
Server.startConnection(); 
另一个类

回答

7

如果未连接,则为null

试试这个:

var h = Connection; 
if (h!=null) 
{ 
    h(true); 
} 

我第一次为了克服那里有检查null和通话之间修改多线程情况下分配给一个(局部)变量。

I.e.下面将是线程安全的:

if (Connection!=null) 
{ 
    Connection(true); // Here, could already be null, again. 
} 
+0

生病尝试了一下,但它也抛出事件,如果它是真的 – Shredder2500 2012-02-24 18:37:58

0

你需要检查并确保东西实际上订阅事件调用它。

if(Connection != null) 
    Connection(true); 
+0

即时通讯对不起,我忘了提及之前函数被称为somthing订阅该事件。我刚刚发布的 – Shredder2500 2012-02-24 18:39:53

0

因为您还没有订阅。当事件没有订户时,它变成null。你有两个选择来解决这个问题(我更喜欢第二个)。

选项1:

if (Connection != null) 
    Connection(true); 

选项2:

public event connectionSuccess Connection = delegate { }; 
+0

更新显示有订户 – Shredder2500 2012-02-24 18:43:15

0

你所得到的错误,因为如果存在空委托引用空引用会抛出异常!所以,有必要检查委托参考。

创建事件调用程序 - 辅助方法是一种很好的做法。它简化了调用事件处理程序。

例如,让我们来看看Book类,它实现INotifyPropertyChanged接口:

class Book : INotifyPropertyChanged 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name == value) 
       return; 

      _name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    #region Implementation of INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    /// <summary> 
    /// Event invocator. 
    /// </summary> 
    /// <param name="propertyName">Property name.</param> 
    private void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion 
} 

有关事件invocators实施更详细的信息是在这里:Events and Races

0

你应该检查你的对象的初始化。虽然你的代码确实使它看起来像所有的东西都在同一个类中,但我不确定为什么你会通过创建事件的头痛而不是仅仅调用方法。然而,如果你在一个班级中提高事件并试图在另一个班级中处理事件,那么你可能遇到与我做过的事情相同的事情。让我解释...

MDIParent - 包含子窗体的实例化代码。还有代码将孩子的事件处理程序连接到MDIParent上的代码。

Form x = new MyTestForm(); 
x.OnMyEvent += this.HandleEvent(myEventArgs); 

MDIChild - 包含我们用来创建事件并实际触发它的代码。

public MyTestForm() 
{ 
    public event EventHappened MyEventHandler; 
} 

稍后在代码中,我们实际上引发事件。

MyEventHandler(new MyEventArgs(this, "some message"); 

,我是用我所有的事件处理程序,我们使用更新状态栏的遇到的问题,是,接线,事件没有发生,直到形式完全初始化。这意味着在我们实际将事件连接到某个事物时,所有设置表单的工作都已完成!

我问这是怎么解决的?好吧,我把所有的初始化代码都移到了一个单独的方法中,并从构造函数中移出。我们调用构造函数来创建表单的实例,连接事件,然后运行所有表单的创建任务。

希望这可以帮助别人!我花了好几天的时间试图弄清楚为什么我的事件是空的,我可以清楚地看到他们被分配了!

相关问题