Пометка статической переменной-члена как [ThreadStatic] указывает компилятору размещать ее в области памяти потока (например, там, где выделен стек потока), а не в области глобальной памяти. Таким образом, каждый поток будет иметь свою собственную копию (которая гарантированно будет инициализирована значением по умолчанию для этого типа, например, null, 0, false и т. Д .; не используйте встроенные инициализаторы, поскольку они будут инициализировать его только для одного потока ).
Итак, когда поток уходит, его область памяти освобождается, освобождая ссылку. Конечно, если это требует немедленного удаления (открытия потоков файлов и т. Д.), А не ожидания фоновой сборки мусора, вам может потребоваться сделать это до выхода из потока.
Может быть ограничение на количество доступного пространства [ThreadStatic], но этого должно быть достаточно для нормального использования. Это должно быть несколько быстрее, чем доступ к коллекции ключей (и более легко потокобезопасно), и я думаю, что это сопоставимо с доступом к обычной статической переменной.
Исправление: С тех пор я слышал, что доступ к переменным ThreadStatic несколько медленнее, чем к обычным статическим переменным. Я не уверен, что это даже на самом деле быстрее, чем доступ к коллекции ключей, но он позволяет избежать проблем сирот (что было вашим вопросом) и необходимости блокировки для обеспечения безопасности потоков, что усложнит подход к коллекции ключей.