Task.Continue与前一个任务的相同上下文

问题描述 投票:0回答:1

我有以下例子

    [TestMethod]
    public void AsyncLocalFlowsInContinuation()
    {
        AsyncLocal<int> local = new AsyncLocal<int>();

        var task1 = Task.Run(() =>
        {
            local.Value = 1;
        });

        local.Value.Should().Be(0);                       

        var t1c = task1.ContinueWith((r) =>
        {
            local.Value.Should().Be(1); //THROW: it is 0 instead
        });

        local.Value.Should().Be(0);

        t1c.Wait();
    }

这不应该开箱即用吗?在我的理解中,AsyncLocal应该像每个任务的静态但特定的一样(例如,适用于在“task1”中创建的子任务),但它在连续任务“t1c”中似乎没有相同的值。我应该指定一些东西来允许ExecutionContext在延续任务中正确地流动吗?或者我错过了一些obvuois?

我的目标是.Net Standard 2.0,这里不一定要使用AsyncLocal,如果它是错误的类型,只要测试的语义保持不变,我就会乐意使用另一个。

c# async-await task
1个回答
-1
投票

任务正常运行并且根据预期的执行流程。但是,问题在于AsyncLocal<T>类,它已经习惯了

表示给定异步控制流本地的环境数据,例如异步方法。

换句话说,分配给local变量的数据对于它所使用的线程上下文是本地的。因此,变量有三个不同的“版本”:一个用于主线程,另一个用于第一个任务的上下文,以及最新的延续任务。每个都有不同的价值。

如果使用普通整数数据类型(int),您将获得预期值。

请参阅以下链接以获取更多信息:

https://msdn.microsoft.com/en-us/library/dn906268(v=vs.110).aspx

Safety of AsyncLocal in ASP.NET Core

© www.soinside.com 2019 - 2024. All rights reserved.