0

我不确定在托管代码中是否可行。让我解释。我需要通过它的 ID 知道一个特定的线程当前正在我的进程中运行。我可以从同一进程中的另一个线程执行此操作吗?

4

4 回答 4

2

我想你的 ID 是指托管 ID。简短的回答是没有直接的方法来枚举进程中的托管线程。在不同的进程中,您可以使用托管调试 API (MDbg) 附加到目标进程并从调试器的角度枚举所有托管线程。如果您可以启动一个单独的进程来执行此操作,这可能是最简单的方法。如果您必须从相同的过程中执行此操作,那也是可能的。但是您需要查看 MDbg 源代码。最新的 MDbg 支持附加到转储文件。您需要实现自己的 ICorDebugDataTarget 以支持实时进程。然后,您可以从同一进程访问您的进程,就像使用 MDbg 附加到转储文件一样。有一些限制,就像分析转储文件与分析实时进程不同。

但正如我所说,如果您有可能产生一个短暂的流程来完成这项工作,那是最简单的。

您可以从这里下载 MDbg 源代码和示例。

于 2013-05-20T01:20:08.467 回答
1

您不能将 ProccessThread id 映射到托管线程 id,如此所述。

您无法枚举进程中的所有托管线程,如此所述。

如果您需要此功能,请维护您自己的托管线程 ID 集合。

于 2013-05-20T01:21:34.803 回答
0

我不认为你可以用托管线程来做到这一点。如果你真的需要这个功能,你可以通过使用显式创建的线程并通过创建自己的线程管理器来维护它们来完成你想要的。每次启动新线程时,您都可以为其分配一个 ID 并将其存储在字典中。这样,应该很容易通过其 ID 查找线程以从中获取所需的信息。当一个线程完成执行时,如果不再需要它,您可以将其从字典中删除。

public class ThreadManager
{
    private int threadID { get; set; }
    public Dictionary<int, Thread> ThreadList { get; set; }

    public ThreadManager()
    {
        this.ThreadList = new Dictionary<int, Thread>();
    }

    public void LaunchThread(Action<string> SomeProcess, string s)
    {
        Thread thread = new Thread(() => SomeProcess(s));
        int id = threadID++;
        thread.Name = id.ToString();
        ThreadList.Add(id, thread);
        thread.Start();
    }

    public void KillThread()
    {
        ThreadList.Remove(Int32.Parse(Thread.CurrentThread.Name));
    }
}
于 2013-05-20T02:25:13.670 回答
-3

我在一个论坛中找到了这个:

int threadId = [something];

Process currentProcess = Process.GetCurrentProcess();

foreach( Thread thread in currentProcess.Threads )
{
    if( thread.ManagedThreadId.Equals( threadId ) )
    {
        // do something
    }
}

自己没试过。

于 2013-05-20T00:49:54.893 回答