gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:13:47 30 4
gpt4 key购买 nike

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com