1

マルチメディア タイマー用の 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です。

4

0 に答える 0