Получить уникальный идентификатор потока - PullRequest
2 голосов
/ 25 сентября 2011

Мне нужно записать фактический идентификатор пользовательского потока в файл журнала.Если я использую Thread.CurrentThread.ManagedThreadId, я не получаю уникальный идентификатор, но один и тот же снова и снова.

Причина состоит в том, чтобы отслеживать log.Info для пользователей по всей системе, и позже, если я вижупроблема, я смогу искать в журнале WHERE threadId = ? и получать весь поток активности из журнала.

Я не против получить его внутри кода log4net.

Я говорю о серверной ветке, а не ручной ветке.

Ответы [ 2 ]

4 голосов
/ 25 сентября 2011

Это НЕ возможно, потому что ваши потоки в ASP.NET/IIS работают в пуле потоков IIS ... даже не гарантируется, что HTTP-запрос полностью выполняется в том же потоке (например, если есть некоторые IОперация / O может "пойти спать" и переназначиться другому потоку из пула) ...

Какова цель?Возможно, есть какой-то другой способ добиться этого ...

РЕДАКТИРОВАТЬ - согласно комментариям:

Чтобы отследить запрос, вы можете попытаться зарегистрировать хеш-код этого запроса (доступный через GetHashCode()) и / или записать в хэш комбинацию значений некоторых свойств/ поля объекта http-запроса ...

Если вы покопаетесь глубже, вы можете получить объект рабочего запроса, который имеет (специфичный для запроса) TraceID свойство ...

если вы хотите отслеживать сеанс, который полностью зависит от вашего управления сеансом (будь то скрытое поле формы HTML и / или файл cookie и / или пользователь и / или что-то еще ...).

3 голосов
/ 25 сентября 2011

Ваше первоначальное предположение является неточным: «фактический поток» используется снова и снова, поэтому вы снова и снова получаете один и тот же идентификатор потока.

Ваша ошибка заключается в предположении, что каждый запрос будет обрабатываться отдельным потоком. ManagedThreadId работает нормально.

Теперь давайте посмотрим, что вы пытаетесь сделать:

Причина в том, чтобы отслеживать log.Info для пользователя по всей системе

Итак, вы хотите отслеживать взаимодействия с пользователем . Не нить, пользователь . Один и тот же пользователь может взаимодействовать в нескольких потоках, и несколько пользователей могут использовать один и тот же поток ... поэтому вы хотите регистрировать идентификатор пользователя , а не идентификатор потока.

...