gpt4 book ai didi

c# - AsyncLocal 的语义与逻辑调用上下文有何不同?

转载 作者:IT王子 更新时间:2023-10-29 03:47:00 24 4
gpt4 key购买 nike

.NET 4.6 引入了 AsyncLocal<T>用于沿着异步控制流流动环境数据的类。我以前用过 CallContext.LogicalGet/SetData为此目的,我想知道这两者在语义上是否以及以何种方式不同(除了明显的 API 差异,如强类型和不依赖字符串键)。

最佳答案

语义几乎相同。两者都存储在 ExecutionContext 中并通过异步调用流动。

不同之处在于 API 更改(正如您所描述的)以及为值更改注册回调的能力。

从技术上讲,实现上有很大的不同,因为 CallContext 每次被复制时都会被克隆(使用 CallContext.Clone),而 AsyncLocal 的数据保存在 ExecutionContext._localValues 字典中,只复制该引用而无需任何额外工作。

为了确保更新仅在您更改 AsyncLocal 的值时影响当前流,将创建一个新字典并将所有现有值浅复制到新字典。

根据使用 AsyncLocal 的位置,这种差异对性能可能有利有弊。

现在,正如 Hans Passant 在评论中提到的那样 CallContext 最初是为远程处理而制作的,并且在不支持远程处理的地方不可用(例如 .Net Core),这可能就是为什么 AsyncLocal 被添加到框架中:

#if FEATURE_REMOTING
public LogicalCallContext.Reader LogicalCallContext
{
[SecurityCritical]
get { return new LogicalCallContext.Reader(IsNull ? null : m_ec.LogicalCallContext); }
}

public IllogicalCallContext.Reader IllogicalCallContext
{
[SecurityCritical]
get { return new IllogicalCallContext.Reader(IsNull ? null : m_ec.IllogicalCallContext); }
}
#endif

注意:Visual Studio SDK 中还有一个 AsyncLocal,它基本上是 CallContext 的包装器,显示了概念的相似程度:Microsoft.VisualStudio.Threading .

关于c# - AsyncLocal 的语义与逻辑调用上下文有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707362/

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