如何在特定时间范围内检查事件是否被提出?

时间:2011-11-04 08:41:15

标签: .net multithreading events c++-cli

我在.Net4.0上使用C ++ CLI编写应用程序我有一个事件处理程序,可以在任何随机时间引发事件 该事件仅在特定时间范围内发生时才有用(或者它应该在一段时间内发生一次) 我需要检查事件是否在过去的时间间隔内被提出一次。如果它没有在特定的时间间隔内被提出,我将提出异常。

我试过像这样实现它:

  1. 将一个布尔标志变量添加到类
  2. 在事件处理程序中,设置 flag = true
  3. 要进行检查我有一个计时器事件:
  4. 计时器事件提升200 ms
  5. 检查标志是否为真
  6. 如果是的话 如果它将计数器设置为0
  7. Timer事件然后将标志设置为false
  8. 如果发现该标志为false,则递增计数器
  9. 如果计数器已达到限制(例如三),则会抛出异常。
  10. 然而,我发现它会产生误报。 Thios可能是因为事件被阻止还是什么?

    有人知道更好的方法吗?我想知道是否有一些方法可以在没有外部计时器事件(或线程)的情况下执行它,因为它可能会中断其他线程。

    提前致谢。

1 个答案:

答案 0 :(得分: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秒钟没有被提升,这应该继续运行并抛出异常。