Приложение выполняет короткие задачи в потоках ThreadPool'а.
Как организовать TLS * для этих потоков?
Проблема: ThreadPool повторно использует (recycles) потоки, т.е. запускает для новых задач потоки, которые, возможно, ранее уже выполняли аналогичную работу. Таким образом, получить уникальный ключ для потока нельзя, и стандартный код типа
TLS tls = (TLS) hashtable[Thread.CurrentThread];
if (tls == null) { /* это новый поток, создаем для него свой TLS */ }
работает неправильно, если текущий поток уже был использован.
Таким образом, необходимо не только дифференцировать потоки в отдельно взятый момент времени, но и на протяжении работы процесса.
Свойство System.Thread.Name не годится, т.к. оно set-once.
Использование LocalDataStoreSlot тоже не подходит, т.к. слоты при перезапуске потоков из ThreadPool'а не сбрасываются.
Thread.GetHashCode(), AppDomain.GetCurrentThreadId() и одноименная функция из Kernel32.dll также возвращают повторяющиеся значения.
*
Thread Local Storage. Необходимо ассоциировать с текущим потоком значение, не повторяющееся между потоками.