ThreadStatic特性


  帶有threadStaticAttribute標記的靜態字段在線程之間不共享。每個執行線程都有一個單獨的字段實例,並獨立地設置和獲取該字段的值。如果在不同的線程上訪問該字段,則它將包含不同的值。除了將threadStaticAttribute屬性應用於字段之外,還必須將其定義為靜態字段(在C中)或共享字段(在Visual Basic中)。不要為標記為threadStaticAttribute的字段指定初始值,因為此類初始化僅在類構造函數執行時發生一次(靜態構造函數),因此只影響一個線程。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             TestStaticThread TestStaticThread1 = new TestStaticThread();
 6             TestStaticThread TestStaticThread2 = new TestStaticThread();
 7 
 8             //Thread1
 9             Thread thread1 = new Thread(TestStaticThread1.SetStatic);
10             thread1.Start();
11 
12             //Thread2
13             Thread thread2 = new Thread(TestStaticThread2.GetStatic);
14             thread2.Start();
15 
16             Console.Read();
17         }
18     }
19 
20     public class TestA
21     {
22         public Guid Guid { get; set; }
23     }
24 
25     public class TestStaticThread
26     {
27         //指示各線程的靜態字段值是否唯一
28         //依賴當前線程,獨立於其它線程
29         [ThreadStatic]
30         private static TestA A;
31 
32         static TestStaticThread()
33         {
34             A = new TestA();
35             A.Guid = Guid.NewGuid();
36             Console.WriteLine("Default:" + A.Guid);
37         }
38 
39         public TestStaticThread()
40         {
41             Console.WriteLine("Constructor:" + A.Guid);
42         }
43 
44         public void SetStatic(object o)
45         {
46             A = new TestA();
47             A.Guid = Guid.NewGuid();
48             Console.WriteLine("SetStatic:" + A.Guid);
49         }
50 
51         public void GetStatic(object o)
52         {
53             if (A != null)
54             {
55                 Console.WriteLine("GetStatic:" + A.Guid);
56             }
57             else
58             {
59                 Console.WriteLine("GetStatic:A Is Null.");
60             }
61         }
62     }

  注:該字段依賴當前線程,當線程池的線程被重用時,可能該字段又表現為“公用”的了。及時清空可以一定程度上解決該問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM