Каков правильный способ утилизации элементов, содержащихся внутри ThreadLocal?

When you use a ThreadLocal and T implements IDisposable, how are you supposed to dispose of the members being held within the ThreadLocal?

Occording to ILSpy The Dispose(), and Dispose(bool) methods of ThreadLocal are

public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    int currentInstanceIndex = this.m_currentInstanceIndex;
    if (currentInstanceIndex > -1 && Interlocked.CompareExchange(ref this.m_currentInstanceIndex, -1, currentInstanceIndex) == currentInstanceIndex)
    {
        ThreadLocal.s_availableIndices.Push(currentInstanceIndex);
    }
    this.m_holder = null;
}

Не похоже, что ThreadLocal пытается вызвать Dispose для своих дочерних членов. Я не могу понять, как ссылаться на каждый поток, который он внутренне выделил, чтобы я мог позаботиться об этом.


Я провел тест со следующим кодом, класс никогда не утилизируется

static class Sandbox
{
    static void Main()
    {

        ThreadLocal test = new ThreadLocal();
        test.Value = new TestClass();

        test.Dispose();
        Console.Read();
    }
}

class TestClass : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    protected void Dispose(bool Disposing)
    {
        Console.Write("I was disposed!");
    }
}

25
задан Nick Bastin 19 November 2011 в 23:46
поделиться

1 ответ

Как вызывается сам метод ThreadLocal.Dispose? Я ожидал бы, что это будет, скорее всего, что-то вроде блока «использования». Я бы предложил обернуть блок «using» для ThreadLocal блоком «using» для ресурса, который будет там храниться.

1
ответ дан 28 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: