При запуске следующего кода из модульного теста я обнаружил, что задание вызывает обратный поток, отличный от потока родителя. У меня не было никаких проблем с этим в консоли или WPF, но когда дело доходит до модульного теста, где родитель не является основным потоком / потоком пользовательского интерфейса, кажется, что поведение несколько иное. Как я мог сделать этот обратный вызов в ту же самую нить, что и родитель?
На этой машине я получаю следующий вывод для этого кода:
родительский поток: 7
дочерняя нить: 8
выходной поток: 9
0
выходной поток: 10
1
выходной поток: 9
2
...
[TestFixture]
public class TplTesting {
private SynchronizationContext synchronizationContext;
[Test]
public void TaskRunsAndReportsBackToTheUiOnItsOwn() {
Debug.WriteLine("the parent thread is: " + Thread.CurrentThread.ManagedThreadId);
Action<string> callback = UpdateIndex;
SendOrPostCallback postCallback = obj => callback((string)obj);
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
synchronizationContext = SynchronizationContext.Current;
Task task = Task.Factory.StartNew(() => {
Debug.WriteLine("the child thread is: " + Thread.CurrentThread.ManagedThreadId);
for (int i = 0; i < 100; i++) { synchronizationContext.Post(postCallback,i.ToString());
Thread.Sleep(100);
}
});
Task.WaitAll(new[] {task});
}
void UpdateIndex(string output) {
Debug.WriteLine("the output thread is: " + Thread.CurrentThread.ManagedThreadId);
Debug.WriteLine( output);
}
}