使用异步任务时,逻辑CallContext值无法流动

6

根据我所阅读的所有内容,以下测试方法应该通过。我正在尝试理解为什么它失败了。私有异步方法中的第一个assert按预期通过。然而,一旦任务被返回并等待,当检索时在CallContext中设置的值现在为null。

    [TestMethod]
    public void LogicalCallContextBlockingTest()
    {
        PerformSimpleAsyncWork().Wait();

        var result = CallContext.LogicalGetData("test");

        Assert.AreEqual(result, "expected");
    }       

    private async Task PerformSimpleAsyncWork()
    {
        await Task.Run(() =>
            {
                System.Threading.Thread.Sleep(100);
                CallContext.LogicalSetData("test", "expected");

                var result = CallContext.LogicalGetData("test");

                Assert.AreEqual(result, "expected");

            });   
    }
1个回答

13

async关键字修饰的方法在被调用时会创建一个子上下文,对该子上下文所做的任何更改都不会传播到父级上下文。

因此,PerformSimpleAsyncWork获取了一个可以查看调用者放入上下文中的任何内容的子上下文,但它所做的任何更改都不会对调用者(LogicalCallContextBlockingTest)可见。

如果您需要更多信息,Stephen Cleary在这篇文章中详细介绍了这种行为。


太棒了,我现在明白了。谢谢! - Michael M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接