C# NUnit将CallContext中的iLogicThreadAffinative项复制到新线程
我在使用C时遇到了NUnit和CallContext的问题,其中NUnit复制了现有调用上下文中的任何内容,该调用上下文在创建新线程时扩展了iLogicThreadAffinative。例如,在以下示例中,在新创建的线程中始终引发异常:C# NUnit将CallContext中的iLogicThreadAffinative项复制到新线程,c#,multithreading,nunit,C#,Multithreading,Nunit,我在使用C时遇到了NUnit和CallContext的问题,其中NUnit复制了现有调用上下文中的任何内容,该调用上下文在创建新线程时扩展了iLogicThreadAffinative。例如,在以下示例中,在新创建的线程中始终引发异常: [Test] public void TestCopiedCallContext() { Foo f = new Foo(); f.a = 1; CallContext.SetData("T
[Test]
public void TestCopiedCallContext()
{
Foo f = new Foo();
f.a = 1;
CallContext.SetData("Test", f);
new Thread(new ThreadStart(delegate()
{
if (CallContext.GetData("Test") != null)
{
throw new Exception("Bad!");
}
})).Start();
Thread.Sleep(500);
}
class Foo : ILogicalThreadAffinative
{
public int a;
}
如果Foo没有扩展iLogicThreadAffinative,那么测试通过。由于其他限制,我正在使用.NET 2.0。我们无法使用较新版本的.NET。我还尝试使用NUnit最新版本中可用的Requires*属性,但没有成功。有人知道如何关闭这种行为吗?我不相信你能做你想做的事。一个人建议将代码放入一个测试运行程序可以访问的程序集中 有一个你可能知道的例子,描述了问题是什么 进行多线程处理的单元测试代码可能具有挑战性,我倾向于隔离线程并包装静态对象 如果是我,我想我会尝试通过在类CallContextWrapper:ICallContextWrapper中包装调用上下文来隔离CallContext.SetData和CallContext.GetData 我将测试我的代码是否使用contextWrapper.SetDataTest,f,并用它来完成 我相信编写CallContext的人测试了它接收一些数据并将其传输到新线程的能力。IMO CallContext是应该已经测试过的框架代码,所以您只需要隔离代码对CallContext的依赖关系