В качестве упражнения я писал код для отображения процессов 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);
}