Em C # ao depurar threads, por exemplo, você pode ver a identificação de cada thread.
Não consegui encontrar uma maneira de obter o mesmo segmento, programaticamente. Eu não conseguia nem obter o ID do segmento atual (nas propriedades do Thread.currentThread
).
Então, eu me pergunto como o Visual Studio obtém os IDs dos threads e existe uma maneira de obter o identificador do thread com a ID 2345
, por exemplo?
fonte
System.Threading.Thread.CurrentThread.ManagedThreadId
não funcionará pelo menos ao usar em um arquivoSetWindowsHookEx
. Em vez disso, precisamos obter o ID do thread da função win32 nativaGetCurrentThreadId()
.Esses serão os IDs dos encadeamentos gerenciados.
ManagedThreadId
é um membroThread
para que você possa obter o ID de qualquer objeto Thread . Isso fornecerá o ManagedThreadID atual :Para obter um encadeamento do SO com o ID do encadeamento do SO (não ManagedThreadID) , você pode tentar um pouco de linq.
Parece que não há como enumerar os threads gerenciados e nenhuma relação entre ProcessThread e Thread, portanto, obter um thread gerenciado por seu ID é difícil.
Para obter mais detalhes sobre o encadeamento gerenciado x não gerenciado, consulte este artigo do MSDN .
fonte
Você pode usar o obsoleto
AppDomain.GetCurrentThreadId
para obter o ID do encadeamento atualmente em execução. Este método usa um PInvoke para o método API Win32GetCurrentThreadID
e retornará a identificação de thread do Windows.Esse método está marcado como descontinuado porque o objeto .NET Thread não corresponde a um único thread do Windows e, como tal, não existe um ID estável que possa ser retornado pelo Windows para um determinado thread do .NET.
Consulte a resposta do configurador para obter mais razões pelas quais esse é o caso.
fonte
Para obter o ID do sistema operacional, use:
fonte
AppDomain.GetCurrentThreadId()
está obsoleto:AppDomain.GetCurrentThreadId
foi descontinuado porque não fornece um ID estável quando os threads gerenciados estão em execuçãofibers (aka lightweight threads)
. Para obter um identificador estável para um segmento gerenciado, use aManagedThreadId
propriedade noThread
. Uso:Thread.CurrentThread.ManagedThreadId
De acordo com o MSDN :
Então, basicamente, o
Thread
objeto não corresponde necessariamente a um encadeamento do SO - e é por isso que não tem o ID nativo exposto.fonte
Para quem está prestes a invadir:
fonte
Para encontrar o ID do segmento atual, use - `Thread.CurrentThread.ManagedThreadId '. Mas, neste caso, você pode precisar do atual ID do thread do win32 - use o pInvoke para obtê-lo com esta função:
Primeiro, você precisará salvar a identificação do segmento gerenciado e a conexão do ID do segmento win32 - use um dicionário que mapeie um ID do win32 para o segmento gerenciado.
Em seguida, para localizar um segmento, ele identifica o segmento do processo usando Process.GetCurrentProcess (). Threads e encontra o segmento com esse ID:
fonte
ProcessThread
objetos, não é o mesmo que (nem herda)Thread
:(thread as Thread)
retornará uma referência nula.O deslocamento no Windows 10 é 0x022C (aplicativo de 64 bits) e 0x0160 (aplicativo de 32 bits):
fonte
System.Threading.Thread.CurrentThread.Namefonte
No código gerenciado, você tem acesso a instâncias do
Thread
tipo para cada encadeamento gerenciado.Thread
encapsula o conceito de um encadeamento do SO e, no CLR atual, há uma correspondência individual com encadeamentos gerenciados e encadeamentos do SO. No entanto, este é um detalhe de implementação, que pode mudar no futuro.O ID exibido pelo Visual Studio é realmente o ID do encadeamento do SO. Esta é não o mesmo que o ID thread gerenciado como sugerido por várias respostas.
O
Thread
tipo inclui um campo de membro IntPtr particular chamadoDONT_USE_InternalThread
, que aponta para a estrutura do SO subjacente. No entanto, como esse é realmente um detalhe de implementação, não é aconselhável buscar essa OMI. E o nome indica que você não deve confiar nisso.fonte
Você pode usar Thread.GetHashCode, que retorna o ID do thread gerenciado. Se você pensa no objetivo de GetHashCode, isso faz sentido - ele precisa ser um identificador exclusivo (por exemplo, chave em um dicionário) para o objeto (o encadeamento).
A fonte de referência para a classe Thread é instrutiva aqui. (Concedido, uma implementação .NET específica pode não se basear nesse código-fonte, mas para fins de depuração, arrisco-me.)
GetHashCode "fornece esse código de hash para algoritmos que precisam de verificações rápidas da igualdade de objetos", portanto, é adequado para verificar a igualdade de threads - por exemplo, para afirmar que um método específico está sendo executado no thread do qual você deseja que ele seja chamado.
fonte