我通过几层第三方代码从我的一段代码中调用,并且通过调用我编写的一些代码,调用在某个时刻回到我的代码中。
换句话说,代码调用链如下所示:
My code #1 --> 3rd party code --> My code #2
不幸的是,我传给第三方代码的任何内容都没有给第二段代码,所以除了代码在同一个线程上运行之外,我没有把第一部分和第二部分绑在一起。 / p>
所以我想知道在一个类的静态字段上简单地使用[ThreadStatic]
是否可以解决这个问题?
由于代码也在Web应用程序中运行,因此我不能仅使用静态字段,因为我需要访问的值(对象)对于每个用户/会话都是不同的。< / p>
即。我会做这样的事情:
internal static class DataHolder
{
[ThreadStatic]
internal static ClassName FieldName;
}
还有其他解决方案吗?
答案 0 :(得分:3)
与其他答案相反,表明这是可以的,在ASP.NET应用程序中使用ThreadStatic
或ThreadLocal<T>
时应该非常小心。
ASP.NET利用线程敏捷性,这意味着多个线程可能会处理相同的请求。为了安全起见,您需要打破封装并将项目存储在当前HttpContext
中,而不是使用ThreadStatic
或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; }
}
}
不幸的是,这种线程敏捷性“功能”的记录非常糟糕。我有理由相信线程切换只能在生命周期中的某些点发生,而不是任意发生,因此,根据生命周期中使用代码的具体方式和位置,可能可以安全{{ 1}}或ThreadStatic
。
我会尝试挖掘一些链接......
答案 1 :(得分:2)
ThreadLocal<T>
:
are static classes shared among different threads in C#
然而,自己一直在那条船上 - 我最终走下了静止路线。它起作用并且安全,因为它是可管理的状态。
答案 2 :(得分:2)
是。 ThreadStatic
将为此工作。您可能希望查看ThreadLocal,这简化了使用线程静态变量。
答案 3 :(得分:2)
是的,[ThreadStatic]应该在你描述的场景中工作如果你可以绝对确定第三方代码总是在你调用第三方代码的同一个线程上回调你。在许多异步回调模型中,通常无法保证这一点。如果回调被严格定义为同步回调,那么你可能没问题。