c# - 为什么ConfigureAwait(true)在单元测试中不起作用?

标签 c# multithreading unit-testing synchronizationcontext

默认情况下,单元测试不会捕获运行它的SynchronizationContext,因此如果您编写如下内容:

[TestMethod]
public async Task AwaitThreadSwitch()
{
    WriteThread();
    await Do();
    WriteThread();
}

private Task Do()
{
    return Task.Run(() =>
    {
        WriteThread();
        Thread.Sleep(50);
    });
}

private void WriteThread()
{
    Debug.WriteLine($"CURRENT THREAD: {Thread.CurrentThread.ManagedThreadId}");
}

您将获得以下输出:

CURRENT THREAD: 8
CURRENT THREAD: 6
CURRENT THREAD: 6

没关系:一旦调用并返回 await,流程就不会返回到原始线程。

现在,如果我这样编写测试方法:

[TestMethod]
public async Task AwaitThreadSwitch()
{
    WriteThread();
    await Do().ConfigureAwait(true);  // <-- note this change
    WriteThread();
}

我期望:

CURRENT THREAD: 8
CURRENT THREAD: 6
CURRENT THREAD: 8 // <-- back to the main Thread

相反,我得到了与第一次测试相同的结果。

为什么执行没有编码回测试方法的主线程?

最佳答案

您似乎误解了为什么测试没有在第一个示例中编码回主线程。这并不是因为某个地方隐式设置了 ConfigureAwait(false)。相反,这是因为没有同步上下文

您的两个测试实际上是相同的。调用 ConfigureAwait(true) 与根本不调用它没有什么不同。只是没有上下文可返回,默认的同步上下文行为是在同一线程中继续。

所以,这就是您在两个测试中看到的情况。因为这两个测试确实做了同样的事情。

关于c# - 为什么ConfigureAwait(true)在单元测试中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43825876/

相关文章:

reactjs - 如何使用 jest.mock 模拟 useRef 并 react 测试库

c# - 将查询字符串结果绑定(bind)到服务器标签并设置按钮的可见属性

c# - 使用 Microsoft.Practices.EnterpriseLibrary.Data 时要丢弃什么?

c# - 如何在多线程中并行运行依赖任务?

java - HikariCP 和服务线程

java - 是重载该方法更好,还是使用可变参数传递 0 到 1 个变量? java

ios - 单元测试(快速/灵活)-(未找到测试)

C# System.InvalidOperationException : The current TransactionScope is already complete

c# - MVC id 值始终为 null

c# - 控制任务的实际并发性