【问题标题】:CallContext vs ThreadStaticCallContext 与 ThreadStatic
【发布时间】:2010-09-21 08:38:50
【问题描述】:

CallContext 和 ThreadStatic 有什么区别?

我了解到,在 ASP.NET 环境中,存储在 CallContext 中的数据可能会在整个请求中持续存在,直到请求结束,而 ThreadStatic 可能会或可能不会工作,因为请求可能会切换线程。我还了解到 HttpContext 是使用 CallContext 在内部存储的。

在常规应用程序中,它们似乎都在同一个线程调用中持续存在。什么时候不是这样?


编辑: 在 cmets 中,我了解到调用上下文是对线程静态存储的抽象。 ASP.NET 框架将数据从一个线程显式移动到下一个线程以处理一个请求。其他想要提供线程敏捷性的框架可以对上下文存储执行相同的操作。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    一个请求通常会在整个过程中使用同一个线程,但肯定不会总是这样 - ASP.NET 展示了线程敏捷性。从 2005 年开始有一个旧的 in-depth blog article about the matter,但从 .NET 4.5 开始 things are rather better

    【讨论】:

    • 当我问(链接点)时,那个 spring.net 线程在我的脑海中。我特别在寻找与非网络案例相关的详细信息。它们本质上是一样的吗?
    • 非网络案例是什么意思?这真的取决于你在做什么——如果你知道你在一个线程中,那么使用 ThreadStatic 是可以的。
    • 我的意思是一个不受 ASP.NET 抽象影响的应用程序。 CallContext 和 ThreadStatic 似乎以相同的方式工作,即它们似乎具有相同的生命周期。我有兴趣了解两者之间的差异。
    • ThreadStatic 与线程明确相关。任何其他框架都可能决定以与 ASP.NET 相同的方式使用线程敏捷性。 CallContext 是一种在您这样做时获取一些上下文的方式。
    • 偶然来到这里,想知道当你回答这个问题时你的代表是什么...... 246.
    【解决方案2】:

    存储为 ThreadStatic 的项目可用于多个请求。 IIS 在请求完成后重用线程来处理后续请求,它甚至可以在处理过程中将请求从一个线程交换到另一个线程。 ASP.Net 在每次请求后清除 CallContext。

    【讨论】:

    • 不仅如此 - 一个请求可以跨线程跳跃,因此您在一个阶段放入 ThreadStatic 的内容在另一个阶段不可用。
    • 维护同一请求的线程之间的调用上下文的机制是什么?
    • ASP.NET 的线程敏捷性处理,基本上。我怀疑它在内部是一个 ThreadStatic,当一个线程由于某种原因停止处理请求时,ASP.NET 将请求和上下文保持在一起,然后在任何线程开始工作时重置它。
    • 好的,我了解到调用上下文是对线程静态存储的抽象,并且 ASP.NET 框架将数据从一个线程显式移动到处理请求的下一个线程。
    • @Jon:线程敏捷行为是否也适用于 WCF?在 WCF 应用程序中使用 ThreadStatic 存储请求特定数据是否安全?
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多