2011-11-04 56 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秒。

相关问题