マルチメディア タイマー用の 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
を呼び出した後にshort を追加することStop
です。