Oczekiwanie na wyzwolenie zdarzenia w testach jednostkowych Silverlight

Używam Silverlight Unit Testing Framework do testowania niektórych klas View Manager. Niektóre testy wymagająPropertyChanged wydarzenia do wystrzelenia.

Obecnie używam kombinacjiEnqueueConditional iWaitHandles

Przykład 1

[TestMethod]
[Asynchronous]
[Timeout(1000)]
public void TestNotificationExample()
{
    var manager = new UserManager();

    var waitHandle = new ManualResetEvent(false);
    manager.PropertyChanged += (sender, propChangArgs) =>
                                {
                                    waitHandler.Set();
                                };
    manager.DoTheThingThatTriggersNotification();
    // The notification event fires aynshronously to this
    EnqueueConditional (() => waitHandler.WaitOne(0));
    // Enqueue other tests here....
    EnqueueTestComplete();
}

To działa. Ale mam pytania, które mnie dręczą:

Czy rzeczywiście muszę korzystać z WaitHandle? Czy sprawdzi się równie dobrze, jeśli użyję bool?

Przykład 2

bool fHasFiredEvent = false;
manager.PropertyChanged += (sender, propChangeArgs) =>
                           { 
                               fHasFiredEvent = true;
                           }
manager.DoTheThingThatTriggersNotification();    
EnqueueConditional (() => fHasFiredEvent);
EnqueueTestComplete();

Czy może byłoby lepiej, gdybym zachował WaitHandle, ale stracił atrybut TimeoutAttribute i przekroczył limit czasu oczekiwania?

Przykład 3

[TestMethod]
[Asynchronous]
public void TestNotificationExample()
{
    var manager = new UserManager();

    var waitHandle = new ManualResetEvent(false);
    manager.PropertyChanged += (sender, propChangArgs) =>
                                {
                                    waitHandler.Set();
                                };
    manager.DoTheThingThatTriggersNotification();
    EnqueueCallback (() => Assert.IsTrue(waitHandler.WaitOne(1000));
    EnqueueTestComplete();
}

Więc teraz napisałem trzy przykłady i wszystkie działają. Moje ostatnie pytanie brzmi

Który miałby najlepszą wydajność? (Nawet jeśli różnica jest znikoma i jest to czysto akademicka yada yada yada. Jest interesująca sama z siebie.)Czy którykolwiek z tych trzech przykładów ma podstawowe wady?

questionAnswers(1)

yourAnswerToTheQuestion