我正在尝试对使用 Prism 事件聚合器的应用程序中的某些行为进行单元测试。我尝试进行单元测试的代码的其中一件事是订阅 UI 线程上的事件。深入研究 EventAggregator 的实现,我发现它是通过SynchronizationContext.Post
.
我认为这个答案可能是一个很好的解决方法,但我最终使用了一个更简单的修复:在单元测试开始时显式设置同步上下文 - 在您尝试阅读之前一直有效SynchronizationContext.Current
这导致我产生一种我不完全理解的行为:
//set the sync context
var thisSyncContext = new SynchronizationContext();
SynchronizationContext.SetSynchronizationContext(thisSyncContext);
thisSyncContext.Post(cb => {
var ctx = SynchronizationContext.Current; //<-- this is null
var equals = thisSyncContext.Equals(ctx); //<-- this is false
},null);
thisSyncContext.Send(cb => {
var ctx = SynchronizationContext.Current; //<-- this is not null
var equals = thisSyncContext.Equals(ctx); //<-- this is true
}, null);
我知道 Post 是异步发生的,而 Send 是同步发生的,当我在线程调试窗口中观看它时,它实际上会跳转到不同的线程 ID,正如您期望异步调用所做的那样。
我想我想了解的是,当我告诉同步上下文执行一个函数时,无论是同步还是异步,我都希望该上下文被保留。它保留用于同步调用,但不用于异步。
为什么会出现这种行为,如何在单元测试中对其进行补偿?