Di C # saat men-debug thread misalnya, Anda dapat melihat setiap ID utas.
Saya tidak dapat menemukan cara untuk mendapatkan utas yang sama, secara terprogram. Saya bahkan tidak bisa mendapatkan ID dari utas saat ini (di properti dari Thread.currentThread
).
Jadi, saya bertanya-tanya bagaimana Visual Studio mendapatkan ID dari utas, dan apakah ada cara untuk mendapatkan pegangan dari utas dengan id 2345
, misalnya?
sumber
System.Threading.Thread.CurrentThread.ManagedThreadId
tidak akan berfungsi setidaknya saat menggunakan di aSetWindowsHookEx
. Sebaliknya, kita harus mendapatkan id utas dari fungsi win32 asliGetCurrentThreadId()
.Ini akan menjadi Id dari thread yang dikelola.
ManagedThreadId
adalah anggotaThread
agar Anda dapat memperoleh ID dari objek Thread apa pun . Ini akan memberi Anda ManagedThreadID saat ini :Untuk mendapatkan utas OS dengan ID utas OS (bukan ManagedThreadID) , Anda dapat mencoba sedikit linq.
Tampaknya tidak ada cara untuk menghitung utas yang dikelola dan tidak ada hubungan antara ProcessThread dan Utas, jadi mendapatkan utas yang dikelola oleh ID itu adalah yang sulit.
Untuk detail lebih lanjut tentang threading Managed vs Unmanaged lihat arcticle MSDN ini .
sumber
Anda dapat menggunakan yang usang
AppDomain.GetCurrentThreadId
untuk mendapatkan ID dari utas yang saat ini berjalan. Metode ini menggunakan PInvoke ke metode Win32 APIGetCurrentThreadID
, dan akan mengembalikan ID utas Windows.Metode ini ditandai sebagai usang karena objek .NET Thread tidak sesuai dengan utas Windows tunggal, dan karenanya tidak ada ID stabil yang dapat dikembalikan oleh Windows untuk utas .NET yang diberikan.
Lihat jawaban konfigurator untuk lebih banyak alasan mengapa ini terjadi.
sumber
Untuk mendapatkan ID OS gunakan:
sumber
AppDomain.GetCurrentThreadId()
sudah usang:AppDomain.GetCurrentThreadId
sudah usang karena tidak memberikan ID stabil saat utas yang dikelola berjalanfibers (aka lightweight threads)
. Untuk mendapatkan pengidentifikasi stabil untuk utas yang dikelola, gunakanManagedThreadId
properti diThread
. Penggunaan:Thread.CurrentThread.ManagedThreadId
Menurut MSDN :
Jadi pada dasarnya,
Thread
objek tidak harus sesuai dengan utas OS - itulah sebabnya ia tidak memiliki ID asli terbuka.sumber
Bagi yang akan diretas:
sumber
Untuk menemukan id utas saat ini gunakan - `Utas.CurrentThread.ManagedThreadId '. Tetapi dalam hal ini Anda mungkin memerlukan id thread win32 saat ini - gunakan pInvoke untuk mendapatkannya dengan fungsi ini:
Pertama Anda harus menyimpan id utas yang dikelola dan koneksi id utas32 - gunakan kamus yang memetakan id win32 untuk utas terkelola.
Kemudian untuk menemukan utas oleh id, lakukan iterate di atas utas proses menggunakan Process.GetCurrentProcess (). Utas dan temukan utas dengan id itu:
sumber
ProcessThread
objek, ini tidak sama dengan (juga tidak mewarisi)Thread
:(thread as Thread)
akan mengembalikan referensi nol.Offset di bawah Windows 10 adalah 0x022C (x64-bit-Application) dan 0x0160 (x32-bit-Application):
sumber
System.Threading.Thread.CurrentThread.Namesumber
Dari kode terkelola, Anda memiliki akses ke instance dari
Thread
jenis untuk setiap utas yang dikelola.Thread
merangkum konsep utas OS dan pada CLR saat ini ada korespondensi satu-ke-satu dengan utas terkelola dan utas OS. Namun, ini adalah detail implementasi, yang dapat berubah di masa depan.ID yang ditampilkan oleh Visual Studio sebenarnya adalah ID utas OS. Ini tidak sama dengan ID utas yang dikelola seperti yang disarankan oleh beberapa balasan.
The
Thread
tipe tidak termasuk bidang anggota IntPtr swasta yang disebutDONT_USE_InternalThread
, yang menunjuk ke struktur OS yang mendasari. Namun, karena ini benar-benar detail implementasi, tidak disarankan untuk mengejar IMO ini. Dan nama semacam menunjukkan bahwa Anda tidak harus bergantung pada ini.sumber
Anda dapat menggunakan Thread.GetHashCode, yang mengembalikan ID utas yang dikelola. Jika Anda berpikir tentang tujuan GetHashCode, ini masuk akal - itu perlu pengidentifikasi unik (misalnya kunci dalam kamus) untuk objek (utas).
Sumber referensi untuk kelas Thread bersifat instruktif di sini. (Memang, implementasi .NET tertentu mungkin tidak didasarkan pada kode sumber ini, tetapi untuk tujuan debugging saya akan mengambil risiko.)
GetHashCode "menyediakan kode hash ini untuk algoritma yang memerlukan pemeriksaan cepat atas kesetaraan objek," sehingga sangat cocok untuk memeriksa kesetaraan Thread - misalnya untuk menegaskan bahwa metode tertentu sedang dijalankan pada utas yang Anda inginkan.
sumber