При запуске следующего кода из модульного теста я обнаружил, что задача перезванивает в другой поток, который synchonizationContext - PullRequest
0 голосов
/ 04 октября 2011

При запуске следующего кода из модульного теста я обнаружил, что задание вызывает обратный поток, отличный от потока родителя. У меня не было никаких проблем с этим в консоли или 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);    
}
}
...