最近在玩一些東西,看到一個有趣的東西,已經出來很久了,但是最近才看到覺得很有趣
但是看了一下官方範例有點看不太懂,之後自己測試一下才發現原來是這樣設計使用的
就是一個 Attribute 叫做 [ThreadStatic]

簡單的說,一般狀況,我們在 宣告一個 static 得值,任何 Thread 去存取他,都會造成本體的影響
但是透過[ ThreadStatic] 會按照 Thread 切開變成原始的值,簡單的說是這樣直接看範例可以秒懂..
[ThreadStatic]
public static int var1;
public static int var2;
public static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
var sw = new Stopwatch();
new Thread(() =>
{
for (int i = 1; i <= 5; i++)
{
var1++;
var2++;
Console.WriteLine("Thread1 var1: {0}", var1);
Console.WriteLine("Thread1 var2: {0}", var2);
Console.ResetColor();
}
}).Start();
new Thread(() =>
{
for (int i = 1; i <= 5; i++)
{
var1++;
var2++;
Console.WriteLine("Thread2 var1: {0}", var1);
Console.WriteLine("Thread2 var2: {0}", var2);
}
}).Start();
}
//Result
/*
Hello, World!
Thread1 var1: 1
Thread1 var2: 1
Thread1 var1: 2
Thread1 var2: 3
Thread2 var1: 1
Thread2 var2: 4
Thread2 var1: 2
Thread2 var2: 5
Thread2 var1: 3
Thread2 var2: 6
Thread2 var1: 4
Thread2 var2: 7
Thread2 var1: 5
Thread2 var2: 8
Thread1 var1: 3
Thread1 var2: 8
Thread1 var1: 4
Thread1 var2: 9
Thread1 var1: 5
Thread1 var2: 10
*/
Result:

從案例看一看就懂,對於 var2 來說,兩隻 Thread 都會進行存取,所以寫入的值是哪一個 Thread 是不確定的
而且值也會往上加上去,但是加上 [ThreadStatic] 就會根據 Thread 切開
詳細可以參考這裡:
https://learn.microsoft.com/zh-tw/dotnet/api/system.threadstaticattribute?view=net-8.0&Wt.mc_id=DT-MVP-4030677
https://zhuanlan.zhihu.com/p/307526186 -
這裡有詳細說明到底TreadStaitc 在 執行中的變化
https://www.cnblogs.com/ryanzheng/p/10962513.html