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!");
}
}
Как вызывается сам метод ThreadLocal.Dispose? Я ожидал бы, что это будет, скорее всего, что-то вроде блока «использования». Я бы предложил обернуть блок «using» для ThreadLocal блоком «using» для ресурса, который будет там храниться.