ThreadStaticAttribute Klass
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Anger att värdet för ett statiskt fält är unikt för varje tråd.
public ref class ThreadStaticAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)]
public class ThreadStaticAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)]
[System.Serializable]
public class ThreadStaticAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ThreadStaticAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)>]
type ThreadStaticAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)>]
[<System.Serializable>]
type ThreadStaticAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Field, Inherited=false)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ThreadStaticAttribute = class
inherit Attribute
Public Class ThreadStaticAttribute
Inherits Attribute
- Arv
- Attribut
Exempel
Följande exempelkod visar hur du använder ThreadStaticAttribute för att säkerställa att ett statiskt fält är unikt för varje tråd. I koden tilldelar varje tråd ett annat begärande-ID till det trådstatiska fältet och simulerar sedan bearbetning av begäranden över flera metodanrop.
using System;
using System.Threading;
class Program
{
[ThreadStatic]
private static string? _requestId;
static void Main()
{
Thread thread1 = new(ProcessRequest);
Thread thread2 = new(ProcessRequest);
thread1.Start("REQ-001");
thread2.Start("REQ-002");
thread1.Join();
thread2.Join();
Console.WriteLine("Main thread execution completed.");
}
static void ProcessRequest(object? requestId)
{
// Assign the request ID to the thread-static field.
_requestId = requestId as string;
// Simulate request processing across multiple method calls.
PerformDatabaseOperation();
PerformLogging();
}
static void PerformDatabaseOperation()
{
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Processing DB operation for request {_requestId}");
}
static void PerformLogging()
{
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Logging request {_requestId}");
}
}
open System
open System.Threading
type ThreadLocal() =
[<ThreadStatic; DefaultValue>]
static val mutable private requestId: string option
static member PerformLogging() =
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Logging request {ThreadLocal.requestId.Value}")
static member PerformDatabaseOperation() =
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Processing DB operation for request {ThreadLocal.requestId.Value}")
static member ProcessRequest(reqId: obj) =
ThreadLocal.requestId <- Some(reqId :?> string)
ThreadLocal.PerformDatabaseOperation()
ThreadLocal.PerformLogging()
[<EntryPoint>]
let main _ =
let thread1 = Thread(ThreadStart(fun () -> ThreadLocal.ProcessRequest("REQ-001")))
let thread2 = Thread(ThreadStart(fun () -> ThreadLocal.ProcessRequest("REQ-002")))
thread1.Start()
thread2.Start()
thread1.Join()
thread2.Join()
Console.WriteLine("Main thread execution completed.")
0
Imports System
Imports System.Threading
Module Program
<ThreadStatic>
Private _requestId As String
Sub Main()
Dim thread1 As New Thread(AddressOf ProcessRequest)
Dim thread2 As New Thread(AddressOf ProcessRequest)
thread1.Start("REQ-001")
thread2.Start("REQ-002")
thread1.Join()
thread2.Join()
Console.WriteLine("Main thread execution completed.")
End Sub
Sub ProcessRequest(ByVal requestId As Object)
' Assign the request ID to the thread-static field
_requestId = requestId.ToString()
' Simulate request processing across multiple method calls
PerformDatabaseOperation()
PerformLogging()
End Sub
Sub PerformDatabaseOperation()
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Processing DB operation for request {_requestId}")
End Sub
Sub PerformLogging()
Console.WriteLine($"Thread {Environment.CurrentManagedThreadId}: Logging request {_requestId}")
End Sub
End Module
Kommentarer
Ett static fält som markerats med ThreadStaticAttribute delas inte mellan trådar. Varje körningstråd har en separat instans av fältet och anger och hämtar värden för det fältet separat. Om fältet används i en annan tråd innehåller det ett annat värde.
Förutom att tillämpa attributet ThreadStaticAttribute på ett fält måste du även definiera det som static (i C# eller F#) eller Shared (i Visual Basic).
Note
Ange inte inledande värden för fält som har markerats med ThreadStaticAttribute. En sådan initiering sker bara en gång när klasskonstruktorn körs och påverkar därför bara en tråd. Om du inte anger något initialt värde initieras fältet till standardvärdet om det är en värdetyp eller till null om det är en referenstyp.
Använd det här attributet som det är och härled inte från det.
Mer information om hur du använder attribut finns i Attribut.
Konstruktorer
| Name | Description |
|---|---|
| ThreadStaticAttribute() |
Initierar en ny instans av ThreadStaticAttribute klassen. |
Egenskaper
| Name | Description |
|---|---|
| TypeId |
När den implementeras i en härledd klass hämtar du en unik identifierare för den här Attribute. (Ärvd från Attribute) |
Metoder
| Name | Description |
|---|---|
| Equals(Object) |
Returnerar ett värde som anger om den här instansen är lika med ett angivet objekt. (Ärvd från Attribute) |
| GetHashCode() |
Returnerar hash-koden för den här instansen. (Ärvd från Attribute) |
| GetType() |
Hämtar den aktuella instansen Type . (Ärvd från Object) |
| IsDefaultAttribute() |
När den åsidosättas i en härledd klass anger du om värdet för den här instansen är standardvärdet för den härledda klassen. (Ärvd från Attribute) |
| Match(Object) |
När den åsidosätts i en härledd klass returneras ett värde som anger om den här instansen är lika med ett angivet objekt. (Ärvd från Attribute) |
| MemberwiseClone() |
Skapar en ytlig kopia av den aktuella Object. (Ärvd från Object) |
| ToString() |
Returnerar en sträng som representerar det aktuella objektet. (Ärvd från Object) |
Explicita gränssnittsimplementeringar
| Name | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mappar en uppsättning namn till en motsvarande uppsättning av sändningsidentifierare. (Ärvd från Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Hämtar typinformationen för ett objekt, som kan användas för att hämta typinformationen för ett gränssnitt. (Ärvd från Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Hämtar antalet typinformationsgränssnitt som ett objekt tillhandahåller (antingen 0 eller 1). (Ärvd från Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Ger åtkomst till egenskaper och metoder som exponeras av ett objekt. (Ärvd från Attribute) |