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.