CallContext.LogicalGetData() 与 ThreadLocal/ThreadStatic

Erm*_*ish 2 c# thread-local task-parallel-library async-await

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

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

Ste*_*ary 5

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

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

记住只存储不可变数据,正如我在我的博客中描述的那样。

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

  • 测量时间没有任何问题。我使用了从开始到结束整个过程的总时间(模拟 100% CPU 负载的多线程工作)。所以它可以比较不同IoC容器的性能差异...... (2认同)