CallContext.LogicalGetData()vs ThreadLocal / ThreadStatic

时间:2016-05-03 16:24:41

标签: c# async-await task-parallel-library thread-local

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

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

1 个答案:

答案 0 :(得分:3)

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

AsyncLocal<T>使用完整.NET框架上的逻辑调用上下文 - 它只有一个更好的API,可以使用即将推出的.NET Core平台,而逻辑调用上下文则不会。

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

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