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.FreeNamedDataSlot-Methode: (String)

 

Veröffentlicht: Oktober 2016

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.

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

[HostProtectionAttribute(SecurityAction.LinkDemand, SharedState = true, 
	ExternalThreading = true)]
public static void FreeNamedDataSlot(
	string name
)

Parameter

name
Type: System.String

Der Name des freizugebenden Datenslots.

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.

Nach dem Aufrufen FreeNamedDataSlot, jeden Thread, der ruft GetNamedDataSlot mit dem gleichen Namen wird ein neues Feld mit dem Namen verbundene zugewiesen. Nachfolgende Aufrufe von GetNamedDataSlot von jedem Thread den neuen Slot zurück. Jedoch einen beliebigen Thread, der immer noch eine System.LocalDataStoreSlot zurückgegeben, die durch einen früheren Aufruf von GetNamedDataSlot können weiterhin den alten Slot verwenden.

Ein Slot, dem ein Name zugeordnet wurde, freigegeben nur, wenn alle LocalDataStoreSlot die vor dem Aufruf von abgerufen wurde FreeNamedDataSlot veröffentlicht und Garbage Collection durchgeführt wurde.

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.

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 einen benannten Datenslot verwenden, um Informationen zu speichern.

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
Verfügbar seit 1.1
Zurück zum Anfang
Anzeigen: