Exportieren (0) Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Thread.SetData-Methode

Legt die Daten im angegebenen Slot auf den derzeit ausgeführten Thread und für die aktuelle Domäne des betreffenden Threads fest. 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 void SetData(
	LocalDataStoreSlot slot,
	Object data
)

Parameter

slot
Typ: System.LocalDataStoreSlot
Der LocalDataStoreSlot, in dem der Wert festgelegt werden soll.
data
Typ: System.Object
Der festzulegende Wert.

Wichtiger HinweisWichtig

.NET Framework stellt zwei Mechanismen für die Verwendung des lokalen Threadspeichers bereit (TLS): threadbezogene statische Felder (Felder, die mit dem ThreadStaticAttribute-Attribut markiert sind) und Datenslots. Threadbezogene statische Felder erzielen eine sehr viel höhere Leistung als Datenslots und ermöglichen eine Typüberprüfung zur Kompilierzeit. Weitere Informationen zum Verwenden von TLS finden Sie unter Lokaler Threadspeicher: Threadbezogene statische Felder und Datenslots.

Threads verwenden zum Speichern threadspezifischer Daten einen Speichermechanismus mit lokalem Speicher. Die .NET Common Language Runtime weist 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 freigeben, nachdem die Threadprozedur beendet und das Thread-Objekt während der Garbage Collection wieder freigegeben wurde. Auf einen Datenslot kann nur der jeweilige Thread zugreifen. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten abrufen.

HinweisHinweis

SetData 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: Thread.SetData(testSlot, "test data").

HinweisHinweis

Das HostProtectionAttribute -Attribut, das auf diesen Typ oder Member angewendet wird, besitzt den folgenden Resources Eigenschaftswert: SharedState | ExternalThreading. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder einer URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter HostProtectionAttribute -Klasse oder SQL Server-Programmierung und Hostschutzattribute.

Dieser Abschnitt enthält zwei Codebeispiele. Im ersten Beispiel wird veranschaulicht, wie ein mit dem ThreadStaticAttribute-Attribut markiertes Feld zum Speichern threadbezogener Informationen verwendet wird. Im zweiten Beispiel wird dieselbe Aufgabe mit einem Datenslot realisiert.

Erstes Beispiel

Im folgenden Beispiel wird veranschaulicht, wie ein mit dem ThreadStaticAttribute-Attribut markiertes Feld zum Speichern threadbezogener Informationen verwendet wird. Dieses Verfahren erzielt eine höhere Leistung als das Verfahren im zweiten Beispiel.


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
 */


Zweites Beispiel

Im folgenden Beispiel wird die Verwendung eines benannten Datenslots zum Speichern threadbezogener Informationen veranschaulicht.


using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread[] newThreads = new Thread[4];
        int i;
        for (i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] =
                new Thread(new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
        Thread.Sleep(2000);
        for (i = 0; i < newThreads.Length; i++)
        {
            newThreads[i].Join();
            Console.WriteLine("Thread_{0} finished.",
                newThreads[i].ManagedThreadId);
        }
    }
}

class Slot
{
    private static Random randomGenerator = new Random();

    public static void SlotTest()
    {
        // Set random data in each thread's data slot.
        int slotData = randomGenerator.Next(1, 200);
        int threadId = Thread.CurrentThread.ManagedThreadId;

        Thread.SetData(
            Thread.GetNamedDataSlot("Random"),
            slotData);

        // Show what was saved in the thread's data slot.
        Console.WriteLine("Data stored in thread_{0}'s data slot: {1,3}",
            threadId, slotData);

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to itself.
        Thread.Sleep(1000);

        int newSlotData =
            (int)Thread.GetData(Thread.GetNamedDataSlot("Random"));

        if (newSlotData == slotData)
        {
            Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}",
                threadId, newSlotData);
        }
        else
        {
            Console.WriteLine("Data in thread_{0}'s data slot changed to: {1,3}",
                threadId, newSlotData);
        }
    }
}


.NET Framework

Unterstützt in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

Es werden nicht alle Versionen sämtlicher Plattformen von .NET Framework unterstützt.. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft