0

全部

我正在编写一个小代码,用于在计算机进程中按线程 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 的托管线程的状态?谢谢。

4

2 回答 2

5

Thread.ManagedThreadId并且ProcessThread.Id没有可比性。第一个由 .NET 运行时分配,而第二个是操作系统分配给每个线程的本机线程句柄的值。

无法将一个映射到另一个

操作系统 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();
于 2013-01-30T11:22:41.317 回答
3

进程线程是非托管线程;aThread.CurrentThread托管线程;虽然两者是相关的,但不能保证两者之间存在 1:1 映射,也不能保证托管线程与同一个非托管线程保持关联。

ManagedThreadId如果您与非托管线程进行比较,我建议不要查看。

于 2013-01-30T11:24:15.963 回答