为什么我在 Framewok 线程池中找不到 Asp.Net 指定的线程
本文关键字:线程 Net Asp 找不到 Framewok 为什么 | 更新日期: 2023-09-27 17:56:43
>ALL
我正在研究一个小代码,用于在计算机进程中按线程 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 的托管线程的状态? 谢谢。
Thread.ManagedThreadId
和ProcessThread.Id
没有可比性。第一个由 .NET 运行时分配,而第二个是操作系统分配给每个线程的本机线程句柄的值。
也无法将一个映射到另一个:
操作系统 ThreadId与托管 ThreadId 没有固定关系 线程,因为非托管主机可以控制 托管线程和非托管线程。具体来说,复杂的主机可以 使用纤程 API 针对同一线程调度多个托管线程 操作系统线程,或在不同的受管线程之间移动 操作系统线程。
因此,您的代码不能按原样工作。
顺便说一句,这里可能存在竞争条件:
ProcessThread[] threads = new ProcessThread[proc.Threads.Count];
proc.Threads.CopyTo(threads, 0);
proc.Threads
可能在初始化数组之后但在执行CopyTo
之前被修改。若要避免此争用条件,请仅评估一次proc.Threads
,例如:
var threads = proc.Threads.ToArray();
进程线程是非托管线程;Thread.CurrentThread
是托管线程;虽然两者是相关的,但不能保证两者之间存在 1:1 的映射,也不能保证托管线程与同一非托管线程保持关联。
如果您与非托管线程进行比较,我建议不要查看ManagedThreadId
。