2010-12-20 73 views
2

有没有办法做到这一点(psedo代码):.NET中是否有构建线程绑定变量的功能?

GetCurrentThread().Items.Add(new RefObject); 

再后来就retrive它

RefObject[] refObjs = GetCurrentThread().Items; 

,并列举的对象。很明显,这两个调用将在它的生命周期内发生在同一个线程上。

基本的想法是,我可以很容易地识别当前线程的项目,并且他们实际上是在此线程中创建的。这与为ASP.NET请求使用Page.Request对象相同 - 您知道它在工作进程中是非常独特的,因此它不会与其他请求同时处于混合状态。我想处理一个像Page.Request这样的线程 - 它会来,然后去,但当它活着时,我可以随意查询它,而不必关心进程中存在的其他威胁。

一旦我做了类似的事情,但它更多的是通过引用编组对象的模拟。我可以考虑多种方法来完成它,但我真的不想手动存储线程和对象之间的映射。对于.NET中的线程,是否有与TransactionScope类似的东西?我在处理同步化的困难和避免竞争条件方面并没有太多的麻烦。 PS:如果没有这个功能,我可以在没有静态变量的情况下至少使用application domain吗?

回答

5

有一个ThreadStatic属性,你可以把它放在一个静态字段中。从那里,你可以建立你想要的任何线程特定的数据。但是,您将无法从另一个线程访问数据(例如,通过线程ID)。

3

除了[ThreadStatic](已经提到),在.NET 4.0中有ThreadLocal<T> - 这是广泛相似,但是使用基于委托的初始化只读线程特定商店。

虽然值本身是只读的,但它可能是对可变对象的引用,从而提供了线程特定的对象模型。

ThreadLocal<T>的一个优点是它不必被绑定到静态字段 - 它可以在lambda体中使用(例如)。但如果你不需要这个,[ThreadStatic]更简单。

相关问题