线程本地存储

use*_*949 30 .net c#

将一些变量本地存储到每个线程的最佳方法是什么?

Ali*_*hat 48

如果您使用.Net 4.0或更高版本,据我所知,推荐使用的方法是使用System.Threading.ThreadLocal<T>延迟初始化作为奖励.

  • 该方法也不限于静态字段. (7认同)

Jam*_*acs 37

您可以指示应使用以下[ThreadStatic]属性存储每个线程的静态变量:

[ThreadStatic]
private static int foo;
Run Code Online (Sandbox Code Playgroud)

  • @DainiusKreivys是的!无论变量的类型是什么,只要您使用`[ThreadStatic]`属性,每个线程就会维护它的唯一实例.我使用`[ThreadStatic]私有静态List <int> foo = new List <int> {20,30};`进行了快速测试.然后,在另一个线程上,我使用包含三个整数的列表初始化相同的foo变量,当该线程结束时,包含主线程引用的两个元素的原始列表保持不变. (3认同)

Con*_*rix 17

在范围是您可以使用命名数据插槽的问题的情况下的另一个选项,例如

    //setting
    LocalDataStoreSlot lds =  System.Threading.Thread.AllocateNamedDataSlot("foo");
    System.Threading.Thread.SetData(lds, "SomeValue");

    //getting
    LocalDataStoreSlot lds = System.Threading.Thread.GetNamedDataSlot("foo");
    string somevalue = System.Threading.Thread.GetData(lds).ToString();
Run Code Online (Sandbox Code Playgroud)

如果你不能做James Kovacs和AdamSane所描述的,那么这只是一个好主意

  • 命名数据槽是否适用于新的"异步任务"模型?是否有额外的东西可以让任务中的插槽可用? (2认同)

Ada*_*ane 6

其他选项是将参数传入线程启动方法.您需要保留范围,但可能更容易调试和维护.