を使用してIDisposableを実装する場合、ThreadLocal内に保持されているメンバーをどのように破棄することになっていますかThreadLocal<T>
?T
ILSpyによると、ThreadLocalのDispose()メソッドとDispose(bool)メソッドは次のとおりです。
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!");
}
}