Прочитать на английском

Поделиться через


Thread.FreeNamedDataSlot(String) Метод

Определение

Удаляет связь между названием и областью для всех потоков в процессе. Для улучшения производительности используйте поля, отмеченные атрибутом ThreadStaticAttribute.

public static void FreeNamedDataSlot (string name);

Параметры

name
String

Имя освобождаемой области данных.

Примеры

Этот раздел содержит два примера кода. В первом примере показано, как использовать поле, помеченное ThreadStaticAttribute атрибутом для хранения информации, относящейся к конкретному потоку. Во втором примере показано, как использовать область данных для того, чтобы сделать то же самое.

Первый пример

В следующем примере показано, как использовать поле, помеченное как, ThreadStaticAttribute чтобы хранить сведения о конкретном потоке. Этот метод обеспечивает лучшую производительность, чем метод, показанный во втором примере.

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

Второй пример

В следующем примере показано, как использовать именованную область данных для хранения сведений о конкретном потоке.

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 предоставляет два механизма использования локального хранилища потока (TLS): статические поля потока (поля, помеченные ThreadStaticAttribute атрибутом) и области данных. Статические поля потоков обеспечивают гораздо лучшую производительность, чем области данных, и обеспечивают проверку типов во время компиляции. дополнительные сведения об использовании TLS см. в разделе Local служба хранилища потока: Thread-Relative статических полей и слотов данных.

После любого вызова потока FreeNamedDataSlot любой другой поток, вызывающий GetNamedDataSlot с тем же именем, будет выделять новый слот, связанный с именем. Последующие вызовы GetNamedDataSlot с помощью любого потока будут возвращать новый слот. Однако любой поток, который по-прежнему имеет значение, System.LocalDataStoreSlot возвращенное предыдущим вызовом метода, GetNamedDataSlot может продолжать использовать старый слот.

Слот, связанный с именем, освобождается только в том случае, если все LocalDataStoreSlot , что было получено перед вызовом, FreeNamedDataSlot освобождено и собрано сборщиком мусора.

Потоки используют механизм локальной памяти хранилища для хранения данных конкретного потока. Среда CLR выделяет массив хранилища данных с несколькими слотами каждому процессу при его создании. Поток может выделить область данных в хранилище данных, сохранить и извлечь значение данных в слоте и освободить слот для повторного использования после истечения срока действия потока. Области данных являются уникальными для каждого потока. Ни один другой поток (даже не дочерний поток) не может получить эти данные.

Применяется к

Продукт Версии
.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

См. также раздел