所有的
我正在开发一个小代码,用于在计算机进程中按线程ID搜索线程。
我的所有代码如下所示,请帮助查看。 :)
using System.Diagnostics;
public class NKDiagnostics
{
private Process[] m_arrSysProcesses;
private void Init()
{
m_arrSysProcesses = Process.GetProcesses(".");
}
public static ProcessThread[] GetProcessThreads(int nProcID)
{
try
{
Process proc = Process.GetProcessById(nProcID);
ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);
return threads;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}
}
在另一个类中,我指定一个线程来执行名为DoNothing
ThreadPool.QueueUserWorkItem((t) => Utility.DoNothing((TimeSpan)t),
TimeSpan.FromMinutes(1));
并且函数DoNothing
代码是
public class Utility
{
public static void DoNothing(TimeSpan timeout, TextBox txtThreadId)
{
TimeoutHelper helper = new TimeoutHelper(timeout);
while (true)
{
Thread.Sleep(1000 * 5);
if (helper.RemainingTime() <= TimeSpan.Zero)
{
MessageBox.Show("This thread's work is finished.");
break;
}
else
{
if (Thread.CurrentThread.IsThreadPoolThread)
{
MessageBox.show( Thread.CurrentThread.ManagedThreadId.ToString());
}
}
}
}
}
我的问题是Thread.CurrentThread.ManagedThreadId
显示10,我在整个过程中搜索了它。但是没找到它。
ProcessThread[] m_Threads = NKDiagnostics.GetProcessThreads(processId);
for (int i = 0; i < m_Threads.Length; i++)
{
if (m_Threads[i].Id.Equals(10))
{
MessageBox.Show("Found it.");
}
}
我错过了什么吗?为什么我找不到这个帖子?请帮助我。谢谢。
更新
我最初想要对此代码进行一些实验的想法是试图找到一种获取托管线程状态的方法。显然我在这里发布的方式并没有成功。所以我的问题是如何知道具有指定线程ID的托管线程的状态?感谢。
答案 0 :(得分:5)
Thread.ManagedThreadId
和ProcessThread.Id
无法比较。第一个是由.NET运行时分配的,而第二个是OS分配给每个线程的本机线程句柄的值。
它也是not possible to map one to the other:
操作系统ThreadId与托管没有固定的关系 线程,因为非托管主机可以控制之间的关系 托管和非托管线程。具体而言,复杂的主机可以 使用Fiber API根据相同的方式安排许多托管线程 操作系统线程,或移动不同的托管线程 操作系统线程。
因此,您的代码无法正常工作。
顺便说一下,这里可能存在竞争条件:
ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);
在初始化数组之后但在proc.Threads
执行之前,可能会修改CopyTo
。为避免此竞争条件,仅评估proc.Threads
一次,例如:
var threads = proc.Threads.ToArray();
答案 1 :(得分:3)
进程线程是非托管线程; Thread.CurrentThread
是托管的主题;虽然两者是相关的,但不能保证两者之间存在1:1的映射,也不能保证托管线程与同一个非托管线程保持关联。
如果您要与非托管线程进行比较,我建议不要查看ManagedThreadId
。