我为多媒体计时器写了一个C#包装器:
Start
方法使用用户指定的回调调用timeSetEvent
,Stop
方法只调用timeKillEvent
。
我有一个单元测试,应该检查Stop
是否有效:
using (var timer = new HighResolutionTimer(20))
{
int counter = 0;
timer.Elapsed += (s, e) => Interlocked.Increment(ref counter);
timer.Start();
Thread.Sleep(40);
timer.Stop();
//Thread.Sleep(10);
int old = counter;
Assert.AreNotEqual(0, old);
Thread.Sleep(40);
Assert.AreEqual(old, counter);
}
我的问题是有时候这个测试失败了,因为在我调用Stop
之后事件又发生了一次。我尝试在创建时添加TIME_KILL_SYNCHRONOUS
标志,但它似乎不起作用。
我无法从文档中理解应该做什么。根据MSDN:
使用TIME_KILL_SYNCHRONOUS创建一个事件 TIME_CALLBACK_FUNCTION标志可防止事件发生 调用timeKillEvent函数。
这是否意味着任何未决事件都不会被执行?或者更确切地说,在执行所有待处理事件后,timeKillEvent
方法可能不会返回?
我在网上搜索但找不到答案。
无论如何,这对我的测试没有帮助。我可以让我的测试始终通过的唯一方法是在致电Sleep
后添加短Stop
。