Auf Englisch lesen

Freigeben über


Thread.FreeNamedDataSlot(String) Methode

Definition

Entfernt die Zuordnung zwischen einem Namen und einem Slot für alle Threads in dem Prozess. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

C#
public static void FreeNamedDataSlot (string name);

Parameter

name
String

Der Name des freizugebenden Datenslots.

Beispiele

Dieser Abschnitt enthält zwei Codebeispiele. Im ersten Beispiel wird gezeigt, wie ein mit dem -Attribut markiertes Feld verwendet wird, ThreadStaticAttribute um threadspezifische Informationen zu enthalten. Im zweiten Beispiel wird gezeigt, wie ein Datenslot verwendet wird, um dasselbe zu tun.

Erstes Beispiel

Im folgenden Beispiel wird gezeigt, wie ein mit markiertes Feld verwendet ThreadStaticAttribute wird, um threadspezifische Informationen zu enthalten. Diese Technik bietet eine bessere Leistung als die im zweiten Beispiel gezeigte Technik.

C#
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
{
    [ThreadStatic]
    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 veranschaulicht, wie ein benannter Datenslot verwendet wird, um threadspezifische Informationen zu speichern.

C#
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);
        }
    }
}

Hinweise

Wichtig

.NET Framework bietet zwei Mechanismen für die Verwendung von lokalem Threadspeicher (TLS): thread relative statische Felder (d. h. Felder, die mit dem -Attribut gekennzeichnet ThreadStaticAttribute sind) und Datenslots. Thread relative statische Felder bieten eine wesentlich bessere Leistung als Datenslots und ermöglichen die Typüberprüfung zur Kompilierzeit. Weitere Informationen zur Verwendung von TLS finden Sie unter Thread Local Storage: Thread-Relative Static Fields and Data Slots.

Nachdem ein Thread aufgerufen hat, weist jeder andere Thread, der mit dem gleichen Namen aufruft, einen neuen FreeNamedDataSlot GetNamedDataSlot Slot zu, der dem Namen zugeordnet ist. Nachfolgende Aufrufe GetNamedDataSlot von durch einen Thread geben den neuen Slot zurück. Allerdings kann jeder Thread, der immer noch über einen verfügt, der von einem früheren Aufruf von zurückgegeben System.LocalDataStoreSlot GetNamedDataSlot wird, weiterhin den alten Slot verwenden.

Ein Slot, der einem Namen zugeordnet wurde, wird nur freigegeben, wenn alle , die vor dem Aufruf von erhalten wurden, freigegeben LocalDataStoreSlot FreeNamedDataSlot und garbage-collected wurden.

Threads verwenden einen lokalen Speicherspeichermechanismus, um threadspezifische Daten zu speichern. Die Common Language Runtime ordnet jedem Prozess beim Erstellen ein Datenspeicherarray mit mehreren Slots zu. Der Thread kann einen Datenslot im Datenspeicher zuordnen, einen Datenwert im Slot speichern und abrufen und den Slot für die Wiederverwendung nach Ablauf des Threads frei geben. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten erhalten.

Gilt für

Produkt Versionen
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1

Siehe auch