Чтобы найти текущий идентификатор потока, используйте - Thread.CurrentThread.ManagedThreadId. Но в этом случае вам может понадобиться текущий идентификатор потока win32 - используйте pInvoke, чтобы получить его с помощью этой функции:
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
Сначала вам нужно сохранить идентификатор управляемого потока и соединение с идентификатором потока win32 - используйте словарь, который отображает идентификатор win32 в управляемый поток.
Затем, чтобы найти поток по его идентификатору, выполните итерацию по потоку процесса с помощью Process.GetCurrentProcess (). Threads и найдите поток с этим идентификатором:
foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
var managedThread = win32ToManagedThread[thread.id];
if((managedThread.ManagedThreadId == threadId)
{
return managedThread;
}
}