Как я могу получить _real_ идентификатор потока в CLR "дружественным" способом? - PullRequest
9 голосов
/ 11 апреля 2011

В качестве упражнения я писал код для отображения процессов O / S и потоков O / S внутри процесса (как это делает проводник процессов Sysinternals).

Я обнаружил, что .net ManagedThreadId не являются идентификаторами потоков O / S. После небольшого чтения я наткнулся на AppDomain.GetCurrentThreadId (). К сожалению, эта функция помечена как «устаревшая» (что может означать «недоступно» в будущем). Одно решение, которое я нашел, состоит в том, чтобы использовать InteropServices для прямого вызова Win32 GetCurrentThreadId. Я в порядке, но это противоречит философии .net.

У меня вопрос: есть ли у CLR "дружественный" способ получения реального идентификатора текущего потока?

Для справки, здесь фрагмент кода, показывающий, что я пробовал до сих пор. // 1 и // 2 отображают правильный идентификатор потока, // 3 и // 4 были попытки получить ту же информацию дружественным для CLR способом (но они не работают.)

Спасибо за помощь,

Джон.

[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();

static void Main(string[] args)
{
  // AppDomain.GetCurrentThreadId() is "obsolete"

  int ThreadId1 = AppDomain.GetCurrentThreadId();   // 1 

  // not the ".net" way of doing things

  int ThreadId2 = GetCurrentThreadId();             // 2 

  // "no joy" attempts to get the same results I got above

  int ThreadId3 = Process.GetCurrentProcess().Threads[0].Id;   // 3
  int ThreadId4 = Thread.CurrentThread.ManagedThreadId;        // 4


  Console.WriteLine("ThreadId1: {0}, ThreadId2: {1}, ThreadId3: {2}, " + 
                    "ThreadId4: {3}",
                    ThreadId1, ThreadId2, ThreadId3, ThreadId4);
}

Ответы [ 2 ]

11 голосов
/ 11 апреля 2011

PВведение в GetCurrentThreadId - ваша лучшая ставка, которая даст вам правильную информацию.

Однако я должен предупредить вас, что есть очень веские причины, по которым CLR не предоставляет эту информацию:совершенно бесполезное значение для управляемого кода.С точки зрения CLR совершенно законно, что один управляемый поток будет поддерживаться несколькими различными собственными потоками в течение срока его службы.Это означает, что результат GetCurrentThreadId может (и будет) изменяться в течение срока жизни потока.

Во многих приложениях это не наблюдаемое явление.В приложении с пользовательским интерфейсом это на самом деле не происходит, потому что обычно оно поддерживается потоком STA, который труднее (обычно даже незаконно) поменять из-за проблем взаимодействия COM.Многие разработчики блаженно не знают об этом.Однако очень легко поменять потоки MTA под капотом, который обычно является контекстом выполнения фонового потока.

0 голосов
/ 11 апреля 2011

Это устарело по причине;идея заключается в том, что в будущем «фактический» идентификатор потока может быть не постоянным или может быть разделен между потоками .NET.

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