我目前正在使用Threadlocal
来保存当前用户的ID,以便在每个用户的网络请求中使用整个应用。我无法访问较低环境中的HttpContext
,但想要访问静态UserId而不将其作为参数传递到任何地方。
最近,我一直在通过async/await.
添加并行操作。这不再能保证我在每个Task.
中都有正确的值
我在AsyncLocal
中研究并发现.Net 4.6
,但目前仅限于.Net 4.5.1
。作为替代方案,CallContext.LogicalGet/SetData()
是否能够实现我想要的目标?
答案 0 :(得分:3)
是的,逻辑调用上下文将作为异步本地。
AsyncLocal<T>
使用完整.NET框架上的逻辑调用上下文 - 它只有一个更好的API,可以使用即将推出的.NET Core平台,而逻辑调用上下文则不会。
请记住only store immutable data,正如我在博客中描述的那样。
此外,异步本地值会对性能产生明显影响。显式传递参数几乎肯定会更高效,可能是您自己的RequestContext
类型的一部分。 ASP.NET vCore正在远离HttpContext.Current
;它仍然具有HttpContext
的概念,但它不再作为异步本地 - 它已被明确传递。