2011-11-04 89 views
0

我正在編寫一個在.Net4.0上使用C++ CLI的應用程序我有一個事件處理程序,可以在任何隨機時間引發一個事件 只有當事件發生在特定時間範圍內時,該事件纔是有用的應該在一段時間內發生一次) 我需要檢查事件是否在過去的時間間隔內提升一次。如果沒有在特定的時間間隔內提出,我會提出一個例外。如何檢查某個事件是否在特定時間範圍內發生?

我試圖實現這樣的:

  1. 一個布爾標誌變量添加到類
  2. 在事件處理程序,設置 標誌=真
  3. 要做到檢查我有一個計時器事件:
  4. 計時器事件引發埃維200毫秒
  5. 檢驗該標誌爲true
  6. 如果是 真它設置一個計數器爲0
  7. 計時器事件,然後將標誌設置爲false
  8. 如果發現該標誌爲假時,計數器加一
  9. 計數器是否已經達到了一個極限(說三),那麼它拋出異常。

但是,我發現它給出了誤報。 Thios可能發生是因爲事件被阻止或什麼?

有沒有人知道更好的方法來做到這一點?我想知道是否有一些方法可以在沒有外部計時器事件(或線程)的情況下完成,因爲它可能會中斷其他線程。

在此先感謝。

+0

我不確定我的評論是否可以幫助你,但是你是否嘗試讓事件處理程序在構造函數中用靜態標誌創建靜態檢查器類的對象?每個對象創建過程都會增加靜態標誌。然後您可以比較標誌的值和時間範圍。 – Aan

回答

0

不知道你的C++ CLI,但產生的影響時,我的單元測試異步事件在C#中我通常這樣做:

[Test] 
    public void CheckThatEventIsRaisedWithinTimeframe() 
    { 
     var eventRaised = new ManualResetEvent(false); 
     subject.SomeEvent += (s, e) => { eventRaised.Set(); }; 

     // Do something which should have triggered the event 

     Assert.True(eventRaised.WaitOne(5000), "Event was not raised."); 
    } 

的WaitOne的調用將阻塞,直到時間耗盡(以這種情況下5秒鐘),或事件發生。在第一種情況下,WaitOne將返回false,在第二種情況下它將返回true。

我想你可以做同樣的事情,例如:

var eventRaised = new AutoResetEvent(false); 
subject.SomeEvent += (s, e) => { eventRaised.Set(); }; 

while(true) 
{ 
    var ok = eventRaised.WaitOne(5000); 
    if(!ok) 
     throw new Exception("Event was not raised for 5 seconds"); 
} 

這應該保持運行,並拋出一個異常,如果該事件不會引發至少每5秒。

相關問題