Thread.GetData-Methode
Ruft in der aktuellen Domäne des aktuellen Threads den Wert aus dem angegebenen Slot für den aktuellen Thread ab.
Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
Public Shared Function GetData ( _
slot As LocalDataStoreSlot _
) As Object
'Usage
Dim slot As LocalDataStoreSlot
Dim returnValue As Object
returnValue = Thread.GetData(slot)
public static Object GetData (
LocalDataStoreSlot slot
)
public:
static Object^ GetData (
LocalDataStoreSlot^ slot
)
public static Object GetData (
LocalDataStoreSlot slot
)
public static function GetData (
slot : LocalDataStoreSlot
) : Object
Parameter
- slot
Der LocalDataStoreSlot, aus dem der Wert abgerufen werden soll.
Rückgabewert
Der abgerufene Wert.
Hinweise
Hinweis
Das auf diese Methode angewendete HostProtectionAttribute-Attribut besitzt den Resources-Eigenschaftenwert SharedState | ExternalThreading. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder eines URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter der HostProtectionAttribute-Klasse oder unter SQL Server-Programmierung und Hostschutzattribute.
Threads verwenden zum Speichern threadspezifischer Daten einen Speichermechanismus mit lokalem Speicher. Die Common Language Runtime ordnet jedem Prozess bei der Generierung ein Datenspeicherarray mit mehreren Slots zu. Der Thread kann einen Datenslot im Datenspeicher reservieren, einen Datenwert im Slot speichern und aus diesem abrufen sowie den Slot für die weitere Verwendung nach Ablauf des Threads freigeben. Datenslots sind pro Thread jeweils eindeutig. Diese Daten kann kein anderer Thread (auch kein untergeordneter Thread) abrufen.
Hinweis
GetData ist eine Shared-Methode, die immer auf den gerade ausgeführten Thread angewendet wird, auch wenn sie mit einer Variablen aufgerufen wird, die auf einen anderen Thread verweist. Um Verwirrung zu vermeiden, rufen Sie Shared-Methoden mit dem Klassennamen auf: Dim test As Object = Thread.GetData(testSlot)
.
Beispiel
Im folgenden Codebeispiel wird die Verwendung eines Datenslots zum Speichern von threadspezifischen Informationen veranschaulicht.
Imports System
Imports System.Threading
Class Test
<MTAThread> _
Shared Sub Main()
Dim newThreads(3) As Thread
For i As Integer = 0 To newThreads.Length - 1
newThreads(i) = New Thread(AddressOf Slot.SlotTest)
newThreads(i).Start()
Next i
End Sub
End Class
Public Class Slot
Shared randomGenerator As Random
Shared localSlot As LocalDataStoreSlot
Shared Sub New()
randomGenerator = new Random()
localSlot = Thread.AllocateDataSlot()
End Sub
Shared Sub SlotTest()
' Set different data in each thread's data slot.
Thread.SetData(localSlot, randomGenerator.Next(1, 200))
' Write the data from each thread's data slot.
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _
AppDomain.GetCurrentThreadId().ToString(), _
Thread.GetData(localSlot).ToString())
' Allow other threads time to execute SetData to show
' that a thread's data slot is unique to the thread.
Thread.Sleep(1000)
' Write the data from each thread's data slot.
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _
AppDomain.GetCurrentThreadId().ToString(), _
Thread.GetData(localSlot).ToString())
End Sub
End Class
using System;
using System.Threading;
class Test
{
static void Main()
{
Thread[] newThreads = new Thread[4];
for(int i = 0; i < newThreads.Length; i++)
{
newThreads[i] = new Thread(
new ThreadStart(Slot.SlotTest));
newThreads[i].Start();
}
}
}
class Slot
{
static Random randomGenerator;
static LocalDataStoreSlot localSlot;
static Slot()
{
randomGenerator = new Random();
localSlot = Thread.AllocateDataSlot();
}
public static void SlotTest()
{
// Set different data in each thread's data slot.
Thread.SetData(localSlot, randomGenerator.Next(1, 200));
// Write the data from each thread's data slot.
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
AppDomain.GetCurrentThreadId().ToString(),
Thread.GetData(localSlot).ToString());
// Allow other threads time to execute SetData to show
// that a thread's data slot is unique to the thread.
Thread.Sleep(1000);
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
AppDomain.GetCurrentThreadId().ToString(),
Thread.GetData(localSlot).ToString());
}
}
using namespace System;
using namespace System::Threading;
ref class Slot
{
private:
static Random^ randomGenerator;
static LocalDataStoreSlot^ localSlot;
static Slot()
{
randomGenerator = gcnew Random;
localSlot = Thread::AllocateDataSlot();
}
public:
static void SlotTest()
{
// Set different data in each thread's data slot.
Thread::SetData( localSlot, randomGenerator->Next( 1, 200 ) );
// Write the data from each thread's data slot.
Console::WriteLine( "Data in thread_{0}'s data slot: {1,3}", AppDomain::GetCurrentThreadId().ToString(), Thread::GetData( localSlot )->ToString() );
// Allow other threads time to execute SetData to show
// that a thread's data slot is unique to the thread.
Thread::Sleep( 1000 );
Console::WriteLine( "Data in thread_{0}'s data slot: {1,3}", AppDomain::GetCurrentThreadId().ToString(), Thread::GetData( localSlot )->ToString() );
}
};
int main()
{
array<Thread^>^newThreads = gcnew array<Thread^>(4);
for ( int i = 0; i < newThreads->Length; i++ )
{
newThreads[ i ] = gcnew Thread( gcnew ThreadStart( &Slot::SlotTest ) );
newThreads[ i ]->Start();
}
}
import System.*;
import System.Threading.*;
import System.Threading.Thread;
class Test
{
public static void main(String[] args)
{
Thread newThreads[] = new Thread[4];
for (int i = 0; i < newThreads.length; i++) {
newThreads[i] = new Thread(new ThreadStart(Slot.SlotTest));
newThreads[i].Start();
}
} //main
} //Test
class Slot
{
private static Random randomGenerator;
private static LocalDataStoreSlot localSlot;
static
{
randomGenerator = new Random();
localSlot = Thread.AllocateDataSlot();
} //static
public static void SlotTest()
{
// Set different data in each thread's data slot.
Thread.SetData(localSlot, new Integer(randomGenerator.Next(1, 200)));
// Write the data from each thread's data slot.
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
String.valueOf(AppDomain.GetCurrentThreadId()),
Thread.GetData(localSlot).toString());
// Allow other threads time to execute SetData to show
// that a thread's data slot is unique to the thread.
Thread.Sleep(1000);
Console.WriteLine("Data in thread_{0}'s data slot: {1,3}",
String.valueOf(AppDomain.GetCurrentThreadId()),
Thread.GetData(localSlot).toString());
} //SlotTest
} //Slot
Plattformen
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.
Versionsinformationen
.NET Framework
Unterstützt in: 2.0, 1.1, 1.0
.NET Compact Framework
Unterstützt in: 2.0, 1.0
Siehe auch
Referenz
Thread-Klasse
Thread-Member
System.Threading-Namespace
SetData
Weitere Ressourcen
Threads und Threading
Lokaler Threadspeicher und vom Thread verwendete statische Felder