【问题标题】:Is there a build in functionality in .NET to create thread bound variables?.NET 中是否有内置功能来创建线程绑定变量?
【发布时间】:2010-12-20 08:56:26
【问题描述】:

有没有办法做到这一点(伪代码):

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

稍后再检索它

RefObject[] refObjs = GetCurrentThread().Items;

并枚举对象。显然,在它的生命周期内,这两个调用都会发生在同一个线程上。

基本思想是我可以轻松识别当前线程的项目,并且它们实际上是在此线程中创建的。这与对 ASP.NET 请求使用 Page.Request 对象相同 - 您知道它在工作进程中非常独特,因此它不会与同时服务的其他请求混淆。我想处理像Page.Request 这样的线程 - 它来了又走,但是当它还活着时,我可以随意查询它,而无需关心过程中存在的其他威胁。

曾经我做过类似的事情,但它更像是通过引用编组对象的模拟。而且我可以想出更多的方法来做到这一点,但我真的不想自己手动存储线程和对象之间的映射。 .NET 中的线程没有类似于 TransactionScope 的东西吗?我对处理同步的困难和避免竞争条件不太感兴趣。

PS:如果这不可用,我至少可以为没有静态变量的application domain 这样做吗?

【问题讨论】:

    标签: .net multithreading scope transactionscope named-scope


    【解决方案1】:

    您可以将ThreadStatic 属性放在静态字段上。从那里,您可以构建所需的任何线程特定数据。但是,您将无法从另一个线程访问数据(例如通过线程 ID)。

    【讨论】:

      【解决方案2】:

      除了[ThreadStatic](已经提到过)之外,在.NET 4.0 中还有ThreadLocal<T> - 大体上 类似,但它是一个使用委托的只读线程特定存储 -基于初始化。

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-26
        • 2015-06-23
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        相关资源
        最近更新 更多