Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NUnit将CallContext中的iLogicThreadAffinative项复制到新线程_C#_Multithreading_Nunit - Fatal编程技术网

C# NUnit将CallContext中的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

我在使用C时遇到了NUnit和CallContext的问题,其中NUnit复制了现有调用上下文中的任何内容,该调用上下文在创建新线程时扩展了iLogicThreadAffinative。例如,在以下示例中,在新创建的线程中始终引发异常:

    [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的依赖关系