C# 为什么NUnit不显示后台线程的控制台输出?

C# 为什么NUnit不显示后台线程的控制台输出?,c#,multithreading,console,nunit,C#,Multithreading,Console,Nunit,我的库有一些后台线程,它们将调试输出打印到Console.WriteLine()。在第一个测试中,我可以在测试的输出中看到来自后台线程的调试行。但接下来的测试不再显示此输出 如果我在测试方法本身中调用Console.WriteLine(),那么这将在测试输出中看到。我已经调试了它和测试调用 测试中的第一个Console.WriteLine() 然后在后台测试中调用Console.WriteLine() 最后,它再次在测试中调用Console.WriteLine() 但是我只直接看到测试的输出

我的库有一些后台线程,它们将调试输出打印到Console.WriteLine()。在第一个测试中,我可以在测试的输出中看到来自后台线程的调试行。但接下来的测试不再显示此输出

如果我在测试方法本身中调用Console.WriteLine(),那么这将在测试输出中看到。我已经调试了它和测试调用

  • 测试中的第一个Console.WriteLine()
  • 然后在后台测试中调用Console.WriteLine()
  • 最后,它再次在测试中调用Console.WriteLine()
但是我只直接看到测试的输出,而没有看到后台线程的输出

看起来NUnit已将捕获的范围保存在线程上下文中


如何从所有后台线程获取控制台输出?

由于我们的库具有重定向日志输出的选项,我们可以在测试中执行以下操作:

    [SetUp]
    public void FixtureSetUp()
    {
        MyLibrary.Console = TestContext.Out;
    }

这不是一个好的解决方案。

因为我们的库有重定向日志输出的选项,所以我们可以在测试中执行以下操作:

    [SetUp]
    public void FixtureSetUp()
    {
        MyLibrary.Console = TestContext.Out;
    }

这不是一个好的解决方案。

它取决于您正在使用的NUnit框架的特定运行时构建。与文本捕获相关的信息保存在NUnit的
TestExecutionContext
中,它在不同的版本中以不同的方式存储

对于所有桌面版本(.NET 2.0、3.5、4.0和4.5),当前的
TestExecutionContext
保存在
CallContext
中。由于
TestExecutionClass
实现了
iLogicThreadAffinative
,因此在创建新线程时,上下文将跟随测试


对于我们的两个.NET标准版本(1.3和1.6),上下文保存在线程本地存储中,因此不会跟随新线程的创建。这是我们希望在有.NET标准2.0版本时克服的限制。

这取决于您使用的NUnit框架的特定运行时版本。与文本捕获相关的信息保存在NUnit的
TestExecutionContext
中,它在不同的版本中以不同的方式存储

对于所有桌面版本(.NET 2.0、3.5、4.0和4.5),当前的
TestExecutionContext
保存在
CallContext
中。由于
TestExecutionClass
实现了
iLogicThreadAffinative
,因此在创建新线程时,上下文将跟随测试


对于我们的两个.NET标准版本(1.3和1.6),上下文保存在线程本地存储中,因此不会跟随新线程的创建。当有.NET标准2.0版本时,这是我们希望克服的一个限制。

也许您应该向NUnit提出一个问题?无意冒犯,但我怀疑其他人会有答案。TestContext.WriteLine()有效吗?@RobProuse该库无法访问NUnit API。@RobProuse感谢TestContext的提示。@Horcrux7如果您能想出一个最小的复制,请提交一个问题。我们应该捕获整个调用上下文的控制台输出。也许您应该用NUnit打开一个问题?无意冒犯,但我怀疑其他人会有答案。TestContext.WriteLine()有效吗?@RobProuse该库无法访问NUnit API。@RobProuse感谢TestContext的提示。@Horcrux7如果您能想出一个最小的复制,请提交一个问题。我们应该捕获整个调用上下文的控制台输出。在100次尝试其他东西后唯一对我有效的东西。在100次尝试其他东西后唯一对我有效的东西。你是说答案?这是不是已经完成了?我在其他地方的做法是让旧答案保持不变,无论正确与否,因为它们是。。。历史的。:-)你是说答案是什么?这是不是已经完成了?我在其他地方的做法是让旧答案保持不变,无论正确与否,因为它们是。。。历史的。:-)