共用方式為


執行緒區域儲存區和執行緒相關的靜態欄位

您可使用 Managed 執行緒區域儲存區 (Thread Local Storage,TLS) 和執行緒相關的靜態欄位來儲存對執行緒及應用程式定義域來說是唯一的資料。如果您可預期於編譯時間的確切需求,則可使用執行緒相關的靜態欄位。如果只能於 Run Time 探索實際的需求,則使用 Managed 執行緒區域儲存區。

在 Unmanaged C++ 中,您使用 TlsAlloc 動態配置位置以及使用 __declspec(thread) 宣告應配置的執行緒相關變數。執行緒區域儲存區和執行緒相關的靜態欄位提供這個行為的 Managed 版本。

執行緒區域儲存區

Managed 執行緒區域儲存區提供對執行緒和應用程式定義域組合來說是唯一的動態資料位置。有命名的位置及未命名的位置等兩種資料位置。命名的位置可能較適合,因為您可使用助憶鍵 (Mnemonics) 識別項。不過,如果另一個元件也使用這個相同的名稱做為它的執行緒相關儲存區,而且執行緒可以從您的元件和其他元件執行程式碼,那麼這兩個元件可能會損毀彼此的資料。您可以使用私用的未命名資料位置來避免這種情況。

Note注意事項

命名及未命名的資料位置都會視執行緒而異。所以即使使用相同的命名位置,某個執行緒也不能從另一個執行緒修改資料。如果同一個執行緒執行兩個使用同一命名資料位置的不同程式碼片段,就會發生衝突。

若要使用 Managed TLS,請使用 Thread.AllocateNamedDataSlotThread.AllocateDataSlot 直接建立您的資料位置,並且使用適當的方法來設定或擷取放置於該處的資訊。

執行緒相關的靜態欄位

如果您的型別欄位對執行緒和應用程式定義域的組合而言是唯一的欄位,請使用 ThreadStaticAttribute 裝飾靜態欄位。請注意,任何類別建構函式 (Constructor) 程式碼均會在存取欄位的第一個內容中的第一個執行緒上執行。在所有其他執行緒或內容中,如果欄位是參考型別,這些欄位將會初始化為 null (在 Visual Basic 中為 Nothing),如果欄位是實值型別,就會初始化為其預設值。因此,您不應依賴類別建構函式來初始化執行緒相關的靜態欄位。而應一律假設執行緒相關的靜態欄位,都是初始化為 null (Nothing) 或其預設值。

請參閱

參考

ContextStaticAttribute
Thread.GetNamedDataSlot
ThreadStaticAttribute
CallContext

其他資源

Managed 執行緒