Получение из ProcessThread в управляемый поток - PullRequest
9 голосов
/ 17 ноября 2009

Периодически мы зависаем при отключении службы Windows в производственной среде, которую мы просто не можем воспроизвести. Могут пройти месяцы, прежде чем это случится снова.

Я добавляю некоторую диагностику, чтобы попытаться помочь с этой проблемой, одна вещь, на которую я смотрю, - это добавление события в пул системных потоков на 60 секунд после того, как мы инициируем завершение работы приложения. Наше приложение должно быть чисто выключено в течение 10 секунд максимума.

В этом случае я хотел бы отследить оставшиеся запущенные потоки процесса в журнале событий.

Я могу получить работающие потоки, используя System.Diagnostics.Process.GetCurrentProcess.Threads. Эти объекты потоков имеют собственные идентификаторы потоков Win32 и т. Д.

Мне было интересно, есть ли какой-нибудь способ вернуться от идентификаторов этих потоков к любым управляемым потокам, которые они представляют в текущем процессе. Причина, по которой я пытаюсь это сделать, заключается в том, что для наших пулов потоков и других потоков, которые мы порождаем, мы даем имена, представляющие их назначение, и это действительно поможет вернуть их обратно.

Ответы [ 2 ]

12 голосов
/ 17 ноября 2009

Это невозможно по следующей причине. Цитата из MSDN :

ThreadId операционной системы не имеет фиксированная связь с управляемым поток, потому что неуправляемый хост может контролировать отношения между управляемые и неуправляемые темы. В частности, сложный хост может использовать API хостинга CLR для планирования много управляемых потоков против одного и того же поток операционной системы, или переместить управляемая нить между разными потоки операционной системы.

Таким образом, не существует однозначного сопоставления между управляемыми потоками и потоками ОС.

Итак, теперь возникает вопрос, как получить список всех управляемых потоков, запущенных в текущий момент в текущем процессе? К сожалению, я не знаю ответа.

0 голосов
/ 19 ноября 2009

Не похоже, что это возможно.
К счастью для нас, у нас есть свои собственные библиотеки потоков, которые обертывают библиотеки .NET, и я смог добавить функциональность, чтобы сохранить список активных потоков, которые мы можем использовать для этой диагностики.
Это работает довольно хорошо, но мы приложили немало усилий и, конечно, провели тестирование, но, надеюсь, мы доберемся до сути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...