今天在这里看到一篇关于Thread.SetData的文章,忽然想起了ThreadStatic特性一样可使变量线程唯一,于是修改了一下代码测试下:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace ThreadSetDataTest
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Thread[] t = new Thread[4];
14 for (int i = 0; i < t.Length; i++)
15 {
16 t[i] = new Thread( new ThreadStart(Slot.SlotTest));
17 t[i].Start();
18 }
19 }
20 }
21
22 class Slot
23 {
24 static Random randomGenerator = new Random();
25
26 /// <summary>
27 /// 线程唯一的变量
28 /// </summary>
29 [ThreadStatic]
30 public static int threadStaticData;
31
32 public static void SlotTest()
33 {
34 // 在每条线程中设置随机的值
35 Thread.SetData(Thread.GetNamedDataSlot("Random"), randomGenerator.Next(0, 200));
36
37 // 同样在每条线程中设置随机的值
38 threadStaticData = randomGenerator.Next(10, 100);
39
40 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3}, ThreadStatic Data is {2}",
41 AppDomain.GetCurrentThreadId(),
42 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), threadStaticData);
43
44 Thread.Sleep(1000);
45
46 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3},ThreadStatic Data is {2}",
47 AppDomain.GetCurrentThreadId(),
48 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), threadStaticData);
49
50 Thread.Sleep(1000);
51
52 Other o = new Other();
53 o.ShowSoltData();
54 }
55
56 }
57
58 class Other
59 {
60 public void ShowSoltData()
61 {
62 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3},ThreadStatic Data is {2}",
63 AppDomain.GetCurrentThreadId(),
64 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), Slot.threadStaticData);
65 }
66 }
67 }
68
出来结果:
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading;
6
7 namespace ThreadSetDataTest
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 Thread[] t = new Thread[4];
14 for (int i = 0; i < t.Length; i++)
15 {
16 t[i] = new Thread( new ThreadStart(Slot.SlotTest));
17 t[i].Start();
18 }
19 }
20 }
21
22 class Slot
23 {
24 static Random randomGenerator = new Random();
25
26 /// <summary>
27 /// 线程唯一的变量
28 /// </summary>
29 [ThreadStatic]
30 public static int threadStaticData;
31
32 public static void SlotTest()
33 {
34 // 在每条线程中设置随机的值
35 Thread.SetData(Thread.GetNamedDataSlot("Random"), randomGenerator.Next(0, 200));
36
37 // 同样在每条线程中设置随机的值
38 threadStaticData = randomGenerator.Next(10, 100);
39
40 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3}, ThreadStatic Data is {2}",
41 AppDomain.GetCurrentThreadId(),
42 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), threadStaticData);
43
44 Thread.Sleep(1000);
45
46 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3},ThreadStatic Data is {2}",
47 AppDomain.GetCurrentThreadId(),
48 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), threadStaticData);
49
50 Thread.Sleep(1000);
51
52 Other o = new Other();
53 o.ShowSoltData();
54 }
55
56 }
57
58 class Other
59 {
60 public void ShowSoltData()
61 {
62 Console.WriteLine("Data is Thread_{0}'s data solt :{1,3},ThreadStatic Data is {2}",
63 AppDomain.GetCurrentThreadId(),
64 Thread.GetData(Thread.GetNamedDataSlot("Random")).ToString(), Slot.threadStaticData);
65 }
66 }
67 }
68