2012-02-24 36 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"); 

,我是用我所有的事件處理程序,我們使用更新狀態欄的遇到的問題,是,接線,事件沒有發生,直到形式完全初始化。這意味着在我們實際將事件連接到某個事物時,所有設置表單的工作都已完成!

我問這是怎麼解決的?好吧,我把所有的初始化代碼都移到了一個單獨的方法中,並從構造函數中移出。我們調用構造函數來創建表單的實例,連接事件,然後運行所有表單的創建任務。

希望這可以幫助別人!我花了好幾天的時間試圖弄清楚爲什麼我的事件是空的,我可以清楚地看到他們被分配了!

相關問題