Warum wird die Task.ContinueWith in diesem Komponententest nicht ausgeführt?

Ich bin auf ein Problem mit einem Komponententest gestoßen, der fehlgeschlagen ist, weil ein TPL-Task sein @ nie ausgeführt haContinueWith(x, TaskScheduler.FromCurrentSynchronizationContext()).

Das Problem stellte sich heraus, weil versehentlich ein Winforms-UI-Steuerelement erstellt wurde, bevor der Task gestartet wurde.

Hier ist ein Beispiel, das es reproduziert. Sie werden sehen, dass der Test erfolgreich ist, wenn Sie ihn unverändert ausführen. Wenn Sie den Test mit unkommentierter Formularzeile ausführen, schlägt der Test fehl.

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        // Create new sync context for unit test
        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

        var waitHandle = new ManualResetEvent(false);

        var doer = new DoSomethinger();

        //Uncommenting this line causes the ContinueWith part of the Task
        //below never to execute.
        //var f = new Form();

        doer.DoSomethingAsync(() => waitHandle.Set());

        Assert.IsTrue(waitHandle.WaitOne(10000), "Wait timeout exceeded.");
    }
}


public class DoSomethinger
{
    public void DoSomethingAsync(Action onCompleted)
    {
        var task = Task.Factory.StartNew(() => Thread.Sleep(1000));

        task.ContinueWith(t =>
        {
            if (onCompleted != null)
                onCompleted();

        }, TaskScheduler.FromCurrentSynchronizationContext());
    }
}

ann jemand erklären, warum dies der Fall is

Ich dachte, es könnte gewesen sein, weil diefalsc SynchronizationContext wird verwendet, aber eigentlich ist dasContinueWith noch ni überhaupt ausführt! Und außerdem, in diesem Unit-Test, ob es das richtige ist oder nichtSynchronizationContext ist irrelevant, da solange daswaitHandle.set() wird für jeden Thread aufgerufen, der Test sollte bestehen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage