Давно чешутся руки протянуть иерархию вызовов через все потоки, для логирования полного стека при возникновении исключений.
Для этого можно использовать CallContext.LogicalSetData, а в перспективе перехода на свежую версию .NET Framework — AsyncLocal.
Само собой, это потребует создания обёрток для ThreadPool, Thread и, боюсь, что Task.
Видите ли вы какие-нибудь подводные камни в этом? В случае CallConext — это ремотинг, который потащит свойства за собой, но данная проблема у меня решена радикально, пользовательские свойства выпиливаются в процессе сериализации сообщения. С AsyncLocal такой проблемы не будет.
Главное — быть может, это уже сделано и мы можем через тот же CallContext добраться до стека родительского потока на момент вызова текущего (с поддержкой ThreadPool и Task)?
Реализация планируется очень простой: создаём маркер вида "Thread {ManagedThreadId} at {StartTime}", при необходимости залогировать исключение, оставляем также и его. Если это первое использование маркера — логируем следом стек вызова, который породил данный поток.
Несколько перпендикулярный, но всё же смежный вопрос по схожей теме — есть ли безопасный способ задать имя каждому запускаемому потоку, для удобства отладки и разбора дампов? Опять же, с поддержкой ThreadPool и Task?