2

我通过多层第 3 方代码从我的一段代码调用,并且调用在某个时候通过调用我编写的一些代码返回到我的代码中。

换句话说,代码调用链如下所示:

我的代码 #1 --> 第 3 方代码 --> 我的代码 #2

不幸的是,我传递给第 3 方的任何代码都没有提供给第二段代码,所以我没有任何东西可以将第一段和第二段联系在一起,除了代码在同一个线程上运行的事实。

所以我想知道如果简单地[ThreadStatic]在一个类的静态字段上使用会是一个可行的解决方案吗?

由于代码也在 Web 应用程序中运行,因此我不能为此使用静态字段,因为每个用户/会话我需要访问的值(对象)是不同的。

IE。我会做这样的事情:

internal static class DataHolder
{
    [ThreadStatic]
    internal static ClassName FieldName;
}

还有其他解决方案吗?

4

4 回答 4

3

与其他建议这没关系的答案相反,您应该非常小心地使用ThreadStaticThreadLocal<T>在 ASP.NET 应用程序中。

ASP.NET 利用线程敏捷性,这意味着同一个请求可能由多个线程处理。为了安全起见,您需要打破封装并将您的项目存储在 currentHttpContext中,而不是使用ThreadStaticor ThreadLocal<T>

internal static class DataHolder
{
    internal static ClassName PropertyName
    {
        get { return (ClassName)System.Web.HttpContext.Current.Items["foo"]; }
        set { System.Web.HttpContext.Current.Items["foo"] = value; }
    }
}

不幸的是,这种线程敏捷性“功能”的文档记录很差。我有理由确定线程切换只能在生命周期中的某些点发生,而不是任意发生,因此取决于代码在生命周期中的确切使用方式和位置,您可能会安全使用ThreadStaticor ThreadLocal<T>

我会尝试挖掘一些链接...

于 2011-03-22T16:59:46.110 回答
2

ThreadLocal<T>对于这个问题中提到的.NET 4:

是 C# 中不同线程之间共享的静态类

然而,我自己也曾在那条船上——我最终走上了静态路线。它有效且安全,因为它是可管理的状态。

于 2011-03-22T16:50:40.047 回答
2

是的。 ThreadStatic将为此工作。您可能想查看ThreadLocal,它简化了线程静态变量的使用。

于 2011-03-22T16:53:01.920 回答
2

是的,如果您可以绝对确定第 3 方代码总是在您调用第 3 方代码的同一线程上调用您,[ThreadStatic] 应该在您描述的场景中工作。在许多异步回调模型中,通常不能保证这一点。如果回调被严格定义为同步回调,那么你可能没问题。

于 2011-03-22T16:53:48.313 回答