gpt4 book ai didi

c# - 为什么当代码稍微重构时 AsyncLocal 返回不同的结果?

转载 作者:行者123 更新时间:2023-12-02 01:15:07 31 4
gpt4 key购买 nike

当我调用WrapperAsync时,AsyncLocalContext.Value返回null。当我在方法外部运行相同的代码块时,在 Main 方法中,AsyncLocalContext.Value 不为 null(这是我所期望的)。

功能完全相同,但结果不同。这是 Asynclocal 类的错误还是有其他解释?

internal class Program
{
private static readonly AsyncLocal<string> AsyncLocalContext = new AsyncLocal<string>();

private static void Main()
{
const string text = "surprise!";

WrapperAsync(text).Wait();
Console.WriteLine("Get is null: " + (AsyncLocalContext.Value == null));
// AsyncLocalContext.Value is null

var value = GetValueAsync(text).Result;
AsyncLocalContext.Value = value;
Console.WriteLine("Get is null: " + (AsyncLocalContext.Value == null));
// AsyncLocalContext.Value is not null
Console.Read();
}

private static async Task WrapperAsync(string text)
{
var value = await GetValueAsync(text);
AsyncLocalContext.Value = value;
}

private static async Task<string> GetValueAsync(string text)
{
await Task.Delay(0);
return text;
}
}

最佳答案

AsyncLocal<T>环境数据存储在ExecutionContext上当前线程的。 ExecutionContext在 async/await 调用链中自动跨线程流动(有关详细信息,请参阅 Stephen Toub 的 blog)。应用程序启动时,默认ExecutionContext使用,但一旦通过 AsyncLocal<T>.Value 存储数据,一个新的ExecutionContext为当前异步调用链创建(请参阅 here ),并将环境数据添加到其中。这个新的上下文被传播到下游调用。

Stephen Cleary 讨论了这种行为 here (向下滚动到 AsyncLocal 部分)并指出要点:

[AsyncLocal] provides a way for contextual information to flow “down” asynchronous calls. Note that the value does not flow “up”.

这就是为什么AsyncLocal<T>调用链下游的更新不会反射(reflect)在上游方法中。

关于c# - 为什么当代码稍微重构时 AsyncLocal<T> 返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49232514/

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