use*_*923 85 c# generics attributes thread-local threadstatic
[ThreadStatic]在ThreadLocal<T>使用泛型时使用属性定义.为什么选择不同的设计方案?在这种情况下使用泛型over属性有哪些优缺点?
Jim*_*hel 96
博客文章在评论中提到的东西没有明确,但我觉得非常重要,那就是[ThreadStatic]不会自动为每个线程初始化事物.例如,假设你有这个:
[ThreadStatic]
private static int Foo = 42;
Run Code Online (Sandbox Code Playgroud)
使用它的第一个线程将看到Foo初始化为42.但随后的线程不会.初始化程序仅适用于第一个线程.因此,您最终必须编写代码来检查它是否已初始化.
ThreadLocal<T> 通过让您提供在第一次访问项目之前运行的初始化函数(如Reed的博客显示)来解决该问题.
在我看来,使用[ThreadStatic]而不是使用ThreadLocal<T>.
mar*_*rai 34
ThreadStatic仅在第一个线程初始化,每个线程的ThreadLocal Initialize.以下是简单演示:
public static ThreadLocal<int> _threadlocal =
new ThreadLocal<int>(() =>
{
return Thread.CurrentThread.ManagedThreadId;
});
public static void Main()
{
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("First Thread: {0}", x);
}
}).Start();
new Thread(() =>
{
for (int x = 0; x < _threadlocal.Value; x++)
{
Console.WriteLine("Second Thread: {0}", x);
}
}).Start();
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

use*_*026 13
ThreadStatic背后的主要思想是为每个线程维护一个单独的变量副本.
class Program
{
[ThreadStatic]
static int value = 10;
static void Main(string[] args)
{
value = 25;
Task t1 = Task.Run(() =>
{
value++;
Console.WriteLine("T1: " + value);
});
Task t2 = Task.Run(() =>
{
value++;
Console.WriteLine("T2: " + value);
});
Task t3 = Task.Run(() =>
{
value++;
Console.WriteLine("T3: " + value);
});
Console.WriteLine("Main Thread : " + value);
Task.WaitAll(t1, t2, t3);
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我们value为每个线程提供了一个单独的副本,包括主线程.
因此,ThreadStatic变量将在其他线程上初始化为其默认值,但创建它的线程除外.
如果我们想以自己的方式在每个线程上初始化变量,请使用ThreadLocal.
| 归档时间: |
|
| 查看次数: |
30833 次 |
| 最近记录: |