You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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会丢失?

原因分析

  1. 测试启动时的上下文设置:NUnit 3.13.3在启动异步测试方法时,会为当前执行线程设置一个临时的SynchronizationContext,所以第一个断言能顺利通过。
  2. await续执行的线程处理:当await Task.Delay(1)完成后,NUnit并没有将之前的SynchronizationContext绑定到执行后续代码的线程上。即使使用了ConfigureAwait(true)(要求捕获当前上下文),但NUnit该版本的实现逻辑中,异步测试的后续代码直接在线程池线程上执行,不会恢复原有的同步上下文。
  3. 线程池线程的特性:线程池线程默认没有关联的SynchronizationContext,所以后续代码在这类线程上运行时,SynchronizationContext.Current会变为null,导致第二个断言失败。

内容的提问来源于stack exchange,提问作者Waescher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:28:13