CallContext LogicalGet(Set)数据在带有async / await的NUnit框架上不起作用?

时间:2013-12-01 20:07:05

标签: c# .net nunit async-await

根据this awesome blog,我们可以安全地设置/获取CallContext的LogicalContext中的数据,即使使用async / await(只要使用.NET 4.5和不可变数据)。

让我们看看以下简单的程序:

...
CallContext.LogicalSetData("id", "123");
var id1 = CallContext.LogicalGetData("id");
await Task.Delay(100);
var id2 = CallContext.LogicalGetData("id");
...

当它在标准控制台程序中运行时,一切正常 - id1和id2都包含值“123”。

但是,如果在NUnit方法中运行,则id2包含NULL,而id1的值为“123”。

有什么理由说它在NUnit框架中不起作用吗?

1 个答案:

答案 0 :(得分:2)

在NUnit的本机运行者(GUI和控制台)下运行时,包含与您发布的代码片段类似的代码片段的测试行为是正确的,即 id1 id2 值为“123”,你可以通过运行下面的测试并检查GUI和控制台中的输出来重现它。

[Test]
public async Task DoSomething()
{
    CallContext.LogicalSetData("id", "123");
    var id1 = CallContext.LogicalGetData("id");
    Console.WriteLine("ID1: " + id1);
    await Task.Delay(100);
    var id2 = CallContext.LogicalGetData("id");
    Console.WriteLine("ID2: " + id2);
}

当您使用R#来运行测试时,这是造成这种错误行为的最可能原因。

值得注意的是,即使测试 async void ,GUI和控制台下的行为也是正确的。