c# - 使 AsyncLocal 更改传播到调用函数

标签 c# asynchronous async-await configureawait

DotNet Fiddle 链接 https://dotnetfiddle.net/GqA32R

我有以下示例代码来演示异步本地功能

static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>();
    public static async Task Main()
    {
        // _asyncLocalString.Value = "Value 1";
        var t1 = AsyncMethodA();
        var t2 = AsyncMethodB();
        await Task.WhenAny(t1, t2).ConfigureAwait(false);
        Console.WriteLine("Finished");
        Console.WriteLine("Async local inside Main: " + _asyncLocalString.Value); // null
    }

    static async Task AsyncMethodA()
    {
        // _asyncLocalString.Value = "Value 2";
        Console.WriteLine("Method A");
        Console.WriteLine("Async local inside A: " + _asyncLocalString.Value); // null
        await Task.Delay(200);
    }

static async Task AsyncMethodB()
    {
        _asyncLocalString.Value = "Value 3";
        Console.WriteLine("Method B");
        await AsyncMethodC().ConfigureAwait(false);
    }

    static async Task AsyncMethodC()
    {
        await Task.Delay(100);
        Console.WriteLine("Method C");
        Console.WriteLine("Async local inside C: " + _asyncLocalString.Value); // Value 3 is printed
    }

输出:
Method B
Method C
Async local inside C: Value 3
Method A
Async local inside A: 
Finished
Async local inside Main: 

有没有办法将这些更改向上传播到调用堆栈,以便 B 中的异步本地更改在 A 和 main 中可见?

我的真实世界场景与我上面的场景类似 - asyncLocal 仅在 methodB 中设置,我们在调用堆栈上有一些语句,它们以不同的方式记录该值。

最佳答案

Is there a way to propogate these changes up the call stack so that async local changes in B are visible in A and main?



不,不与 AsyncLocal<T> . async methods set their value context to "copy-on-write" ,所以如果它被写入,将创建一个副本。并且副本永远不会“向上流动”。

您将需要使用其他一些机制来实现您想要做的任何事情。

关于c# - 使 AsyncLocal 更改传播到调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62295975/

相关文章:

javascript - promise -如何处理已知错误

c# - 为什么我的证书集合中存在 .Pfx 而不是我的 .Cer?

c# - 如何禁用 LINQ to Sql 事务?

c# - 在 C# 中使用 Dictionary<T, Func<List, bool>> 查找列表中最常见的事件

Javascript XmlHttpRequest 回调

asynchronous - 如何确保所有数据都从 clojure core.async channel 写入文件?

c# - 无法调试使用并发异步/等待的程序

c# 使用正则表达式获取内容中的 html 标签和下一个元素

javascript - express 4 的异步包装函数不会捕获错误

c# - 在 native 函数回调线程上运行异步任务继续