CallContext.LogicalGetData() 对比 ThreadLocal/ThreadStatic

CallContext.LogicalGetData() vs ThreadLocal/ThreadStatic

我目前正在使用 Threadlocal 保存当前用户的 ID,以便根据每个用户的 Web 请求在整个应用程序中使用。我无法在较低的环境中访问 HttpContext,但想访问静态 UserId 而不将其作为参数传递到任何地方。 最近,我一直在通过 async/await. 添加并行操作这不再能保证我在每个 Task.

中都有正确的值

我在 .Net 4.6 中研究并发现了 AsyncLocal,但目前仅限于 .Net 4.5.1。作为替代方案,CallContext.LogicalGet/SetData() 是否能够实现我正在寻找的目标?

是的,逻辑调用上下文将作为异步本地工作。

AsyncLocal<T> 在完整的 .NET 框架上使用逻辑调用上下文——它只是有一个更好的 API 并且将与即将推出的 .NET Core 平台一起工作,而逻辑调用上下文则不会。

记得only store immutable data,正如我在我的博客中描述的那样。

此外,异步本地值对性能有一定的影响。显式传递参数几乎肯定会更高效,也许作为您自己的 RequestContext 类型的一部分。 ASP.NET vCore 正在远离 HttpContext.Current;它仍然具有 HttpContext 的概念,但它不再充当异步本地 - 它已显式传递。