Lol*_*Run 304 .net c# multithreading
例如,在调试线程的C#中,您可以看到每个线程的ID.
我无法通过编程方式找到获得相同线程的方法.我甚至无法获得当前线程的ID(在属性中Thread.currentThread).
所以,我想知道Visual Studio如何获取线程的ID,并且有没有办法获取带有id的线程的句柄2345,例如?
Bli*_*ndy 422
GetThreadId返回给定本机线程的ID.有一些方法可以使它与托管线程一起使用,我敢肯定,您需要找到的只是线程句柄并将其传递给该函数.
GetCurrentThreadId 返回当前线程的ID.
GetCurrentThreadId自.NET 2.0起已被弃用:推荐的方法是Thread.CurrentThread.ManagedThreadId属性.
bad*_*d99 76
例如,在调试线程的C#中,您可以看到每个线程的ID.
这将是托管线程的ID. ManagedThreadId是一个成员,Thread所以你可以从任何Thread对象获取Id .这将获得当前的ManagedThreadID:
Thread.CurrentThread.ManagedThreadId
Run Code Online (Sandbox Code Playgroud)
要通过它的OS线程ID (而不是ManagedThreadID)来获取OS线程,您可以尝试一些linq.
int unmanagedId = 2345;
ProcessThread myThread = (from ProcessThread entry in Process.GetCurrentProcess().Threads
where entry.Id == unmanagedId
select entry).First();
Run Code Online (Sandbox Code Playgroud)
似乎没有办法枚举托管线程并且没有ProcessThread和Thread之间的关系,因此通过它的Id获取托管线程是一个艰难的.
有关托管与非托管线程的更多详细信息,请参阅此MSDN arcticle.
Pau*_*ner 44
您可以使用deprecated AppDomain.GetCurrentThreadId来获取当前正在运行的线程的ID.此方法使用PInvoke到Win32 API方法GetCurrentThreadID,并将返回Windows线程ID.
此方法被标记为已弃用,因为.NET Thread对象不对应于单个Windows线程,因此没有稳定的ID可由Windows为给定的.NET线程返回.
请参阅配置程序的答案,了解更多原因.
Mar*_*ers 31
要获取操作系统ID,请使用:
AppDomain.GetCurrentThreadId()
Run Code Online (Sandbox Code Playgroud)
ezo*_*tko 14
对于那些即将入侵的人:
public static int GetNativeThreadId(Thread thread)
{
var f = typeof(Thread).GetField("DONT_USE_InternalThread",
BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
var pInternalThread = (IntPtr)f.GetValue(thread);
var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 548 : 348); // found by analyzing the memory
return nativeId;
}
Run Code Online (Sandbox Code Playgroud)
Dro*_*per 10
要查找当前线程Id,请使用 - "Thread.CurrentThread.ManagedThreadId".但在这种情况下,您可能需要当前的win32线程ID - 使用pInvoke来获取此函数:
[DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]
public static extern Int32 GetCurrentWin32ThreadId();
Run Code Online (Sandbox Code Playgroud)
首先,您需要保存托管线程ID和win32线程ID连接 - 使用将win32 id映射到托管线程的字典.
然后通过它的id找到一个线程使用Process.GetCurrentProcess()迭代进程的线程.线程并找到具有该id的线程:
foreach (ProcessThread thread in Process.GetCurrentProcess().Threads)
{
var managedThread = win32ToManagedThread[thread.id];
if((managedThread.ManagedThreadId == threadId)
{
return managedThread;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 10
Windows 10下的偏移量为0x022C(x64位应用程序)和0x0160(x32位应用程序):
public static int GetNativeThreadId(Thread thread)
{
var f = typeof(Thread).GetField("DONT_USE_InternalThread",
BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance);
var pInternalThread = (IntPtr)f.GetValue(thread);
var nativeId = Marshal.ReadInt32(pInternalThread, (IntPtr.Size == 8) ? 0x022C : 0x0160); // found by analyzing the memory
return nativeId;
}
Run Code Online (Sandbox Code Playgroud)
截至 2022 年 7 月,VS2022 IDE 建议使用System.Environment.CurrentManagedThreadId而不是Thread.CurrentThread.ManagedThreadId
引用自https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1840:
System.Environment.CurrentManagedThreadId 是 Thread.CurrentThread.ManagedThreadId 模式的紧凑且高效的替代方案。
System.Threading.Thread.CurrentThread.Name
System.Threading.Thread.CurrentThread.ManagedThreadId
Run Code Online (Sandbox Code Playgroud)
从托管代码中,您可以访问Thread每个托管线程的类型实例.Thread封装了OS线程的概念,并且在当前CLR中,与托管线程和OS线程一一对应.但是,这是一个实现细节,可能在将来发生变化.
Visual Studio显示的ID实际上是OS线程ID.这是不一样的托管线程ID几种答复的建议.
该Thread类型确实包含一个名为的私有IntPtr成员字段DONT_USE_InternalThread,该字段指向底层的OS结构.但是,由于这实际上是一个实施细节,因此不宜采用这种IMO.名称有点表明你不应该依赖于此.
| 归档时间: |
|
| 查看次数: |
305434 次 |
| 最近记录: |