为何await后NUnit丢失SynchronizationContext?测试失败原因
NUnit 3.13.3(.NET 7.0)异步测试中SynchronizationContext丢失原因
问题场景
以下异步测试代码在NUnit 3.13.3 + .NET 7.0环境下执行失败:
[Test] public async Task Test_Keeps_SynchronizationContext() { SynchronizationContext.Current.Should().NotBeNull(); // 断言正常通过 await Task.Delay(1).ConfigureAwait(true); SynchronizationContext.Current.Should().NotBeNull(); // 断言失败 }
核心疑问:为何执行await操作后,NUnit中的SynchronizationContext会丢失?
原因分析
- 测试启动时的上下文设置:NUnit 3.13.3在启动异步测试方法时,会为当前执行线程设置一个临时的SynchronizationContext,所以第一个断言能顺利通过。
- await续执行的线程处理:当
await Task.Delay(1)完成后,NUnit并没有将之前的SynchronizationContext绑定到执行后续代码的线程上。即使使用了ConfigureAwait(true)(要求捕获当前上下文),但NUnit该版本的实现逻辑中,异步测试的后续代码直接在线程池线程上执行,不会恢复原有的同步上下文。 - 线程池线程的特性:线程池线程默认没有关联的SynchronizationContext,所以后续代码在这类线程上运行时,
SynchronizationContext.Current会变为null,导致第二个断言失败。
内容的提问来源于stack exchange,提问作者Waescher
相关产品推荐
相关产品推荐

