2013-07-03 66 views
0

我正在編寫一個記錄用戶空閒時間的程序,但是當我嘗試運行該程序時,它會引發堆棧溢出異常。爲什麼我的自定義事件會引發異常?

這些

public void OnInactive(EventArgs e) 
{ 
    this.OnInactive(new EventArgs()); 
    do 
    { 
     var idle2 = GetIdleTime(); 
     GetIdleTime(); 
     System.Diagnostics.Debug.WriteLine(idle2); 
    } 
    while (timer.Interval > 5000); 
} 

public void OnActive(EventArgs e) 
{ 
    this.OnActive(new EventArgs()); 
    if (timer.Interval < 5000) 
    { 
     var idle3 = GetIdleTime(); 
     System.Diagnostics.Debug.WriteLine(idle3); 
    } 
} 

我breakpointed的代碼,試圖找出問題,這似乎在於內this.OnInactive(new EventArgs());的來源我的自定義事件,但是我敢對如何解決這個難倒因爲我是Custom Events的初學者,並沒有長時間在C#中編寫代碼。

任何和所有這個問題的幫助將不勝感激!

在此先感謝=]

+0

首先刪除所有斷點並使用日誌文件。你可以把以下幾行添加日誌文件File.AppendAllText(path,「MessageValueOrVariableValue」) –

+0

這是一個有點含糊,我想要做的就是讓這個事件觸發 –

回答

5

你的處理方法是在入境立刻自稱:

this.OnInactive(new EventArgs()); 

這導致調用序列:

OnInactive - > OnInactive - > OnInactive - > ... - >

這會一直持續到堆棧空間用盡,並且StackOverflowException被運行時拋出。

目前還不清楚你想通過遞歸調用來實現什麼,但你應該能夠刪除它。

您的OnActive處理程序中有同樣的問題。

編輯:在迴應評論時,似乎你正試圖在你的方法開始時提出事件本身。假設你的事件聲明如下:

public event EventHandler InActive; 

那麼你就可以提出來:

EventHandler inactiveEvent = this.InActive; 
if(inactiveEvent != null) 
{ 
    inactiveEvent(this, e); 
} 

,同樣爲您Active事件。

+0

感謝超級快速回答李,但我我已經嘗試過這種解決方案,當我評論這些代碼行時,事件似乎並沒有發起任何事情,並且從我通過Web上的研究瞭解到的情況下,我需要此次調用來激發事件 –

+0

也許他的意思是' base.onInactive()' – haim770

+0

@ReeceCottam - 處理器必須被調用一次,否則你永遠不會得到堆棧溢出。你如何註冊事件句柄?你的'OnInactive'和'OnActive'處理程序沒有事件處理程序的預期簽名。 – Lee

0

我覺得你試圖調用基本方法,但實際上你現在打OnInactive打電話OnInactive。此行爲是遞歸的,並將最終停止到期StackOverflow exception

您可以使用base.<function name>調用基函數。 例如:

class SpecialDerived : Base 
{ 
    public override void Say() 
    { 
     Console.WriteLine("Called from Special Derived."); 
     base.Say(); 
    } 
} 

更多信息:http://msdn.microsoft.com/en-us/library/hfw7t1ce(v=vs.71).aspx

+0

不,我試圖讓這個事件發生,它似乎並沒有在這時做 –

0

這些都不是事件處理程序,這些都是要 的方法,以提高有效和無效事件被稱爲 - 里斯 Cottam

您需要實際調用該事件。

public class ReecesWatcher 
{ 
    public event EventHandler ActiveEvent; 
    public event EventHandler InactiveEvent; 


    protected virtual void OnInactive(EventArgs e) 
    { 
     // Fire the event using the() syntax. Fire it through 
     // a test variable so that we can reliabilty test for null, 
     // if there are no subscribers. 
     EventHandler inactiveEventTest = InactiveEvent; 
     if (inactiveEventTest != null) 
     { 
      inactiveEventTest(this, new EventArgs()); 
     } 

     do 
     { 
      var idle2 = GetIdleTime(); 
      GetIdleTime(); 
      System.Diagnostics.Debug.WriteLine(idle2); 
     } 
     while (timer.Interval > 5000); 
    } 

    protected virtual void OnActive(EventArgs e) 
    { 
     // Fire the event using the() syntax. Fire it through 
     // a test variable so that we can reliabilty test for null, 
     // if there are no subscribers. 
     EventHandler activeEventTest = ActiveEvent; 
     if (activeEventTest != null) 
     { 
      activeEventTest(this, new EventArgs()); 
     } 

     if (timer.Interval < 5000) 
     { 
      var idle3 = GetIdleTime(); 
      System.Diagnostics.Debug.WriteLine(idle3); 
     } 
    } 

    // ... the rest of your class, where you call OnActive and OnInactive to 
    // cause the events to be fired. 
} 

我建議不要讓你的OnActive和OnInactive方法公開,否則你暴露過多的執行你的程序的其餘部分。如果你希望這個類繼承自它,那麼將它們保護起來,否則我通常會把它們完全私有化,因爲它們基本上是由其他類調用的包裝函數。

+0

重要編輯!我忽略了受保護方法的'虛擬'關鍵字。 – antiduh

0

我認爲你需要的是對事件的更多理解。讓我通過示例代碼解釋相同的內容。

Class A{ 
    public event OnInactive; 
    public event OnActive; 
} 

時發生CLASSA任何更改要在ClassB的更新的東西。所以你將在ClassB中實現A類的事件。

this鏈接將會對您進行詳細描述。

我的理解是,當您從同一班級觸發並在同一班級中聆聽時,沒有使用任何活動。

相關問題