Когда вы используете ThreadLocal<T>
и T реализует IDisposable, как вы должны распоряжаться членами, находящимися внутри ThreadLocal?
В соответствии с ILSpy Методы Dispose() и Dispose (bool) ThreadLocal являются
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<T>.s_availableIndices.Push(currentInstanceIndex);
}
this.m_holder = null;
}
Не похоже, что ThreadLocal пытается вызвать Dispose на нем дочерние элементы. Я не могу сказать, как ссылаться на каждый поток, который он внутренне выделил, поэтому я могу позаботиться об этом.
Я проверил тест со следующим кодом, класс никогда не размещается
static class Sandbox
{
static void Main()
{
ThreadLocal<TestClass> test = new ThreadLocal<TestClass>();
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!");
}
}