Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Thread.GetData-Methode: (LocalDataStoreSlot)

 

Veröffentlicht: Oktober 2016

Ruft in der aktuellen Domäne des aktuellen Threads den Wert aus dem angegebenen Slot für den aktuellen Thread ab. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

Namespace:   System.Threading
Assembly:  mscorlib (in mscorlib.dll)

[HostProtectionAttribute(SecurityAction.LinkDemand, SharedState = true, 
	ExternalThreading = true)]
public static object GetData(
	LocalDataStoreSlot slot
)

Parameter

slot
Type: System.LocalDataStoreSlot

Der LocalDataStoreSlot, aus dem der Wert abgerufen werden soll.

Rückgabewert

Type: System.Object

Der abgerufene Wert.

System_CAPS_importantWichtig

.NET Framework stellt zwei Mechanismen für die Verwendung lokaler Threadspeicher (TLS): threadbezogene statische Felder (Felder, die mit der ThreadStaticAttribute Attribut) und Datenslots. Threadbezogene statische Felder bieten wesentlich bessere Leistung als Datenslots und Kompilierzeittyp Überprüfung aktivieren. Weitere Informationen zum Verwenden von TLS finden Sie unter Thread Local Storage: Thread-Relative Static Fields and Data Slots.

Threads verwenden einen lokalen Speichermechanismus threadspezifische Daten zu speichern. Die common Language Runtime ordnet ein Multi-Slots Speicher-Array für jeden Prozess, bei der Erstellung. Der Thread kann einen Datenslot im Datenspeicher reservieren, speichern und Abrufen eines Datenwert im Slot und den Slot für die Wiederverwendung nach Ablauf des Threads freigeben. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten abrufen.

System_CAPS_noteHinweis

GetData ist eine Shared Methode, die immer auf den gerade ausgeführten Thread angewendet wird, auch wenn Sie mit einer Variablen, die auf einem anderen Thread aufgerufen. Um Verwirrung zu vermeiden, verwenden Sie den Klassennamen beim Aufrufen von Shared Methoden: Dim test As Object = Thread.GetData(testSlot).

Dieser Abschnitt enthält zwei Codebeispiele. Das erste Beispiel zeigt, wie Sie ein Feld verwenden, die mit der ThreadStaticAttribute Attribut, um Informationen zu speichern. Im zweiten Beispiel wird veranschaulicht, wie eine Datenslots dasselbe tun.

Ersten Beispiel

Das folgende Beispiel zeigt, wie Sie ein Feld verwenden, die mit ThreadStaticAttribute zum Speichern von threadspezifischen Informationen. Dieses Verfahren bietet eine bessere Leistung als die Technik, die im zweiten Beispiel angezeigt wird.

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for(int i = 0; i < 3; i++)
        {
            Thread newThread = new Thread(ThreadData.ThreadStaticDemo);
            newThread.Start();
        }
    }
}

class ThreadData
{
    [ThreadStaticAttribute]
    static int threadSpecificData;

    public static void ThreadStaticDemo()
    {
        // Store the managed thread id for each thread in the static
        // variable.
        threadSpecificData = Thread.CurrentThread.ManagedThreadId;

        // Allow other threads time to execute the same code, to show
        // that the static data is unique to each thread.
        Thread.Sleep( 1000 );

        // Display the static data.
        Console.WriteLine( "Data for managed thread {0}: {1}", 
            Thread.CurrentThread.ManagedThreadId, threadSpecificData );
    }
}

/* This code example produces output similar to the following:

Data for managed thread 4: 4
Data for managed thread 5: 5
Data for managed thread 3: 3
 */

Zweiten Beispiel

Im folgenden Beispiel wird veranschaulicht, wie eine Datenslots zum Speichern von Informationen.

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());
    }
}

.NET Framework
Verfügbar seit 1.1
Zurück zum Anfang
Anzeigen: