我正在寻找一种方法来确定它最初产生的其他线程的线程。我不知道是否有机制来执行此操作,类似于新的.NET新任务并行库中的“任务”中的“Parent”属性。.NET框架线程“血统”
编辑: 进一步调查实际上似乎表明没有位置存储这些信息,所以短缺真正丑陋的黑客,这似乎不可能透明地实现。
因此,我认为我会接受下面的示例代码作为解决问题的最可行(非透明)答案,即使我必须自己寻找替代设计。谢谢:)
我正在寻找一种方法来确定它最初产生的其他线程的线程。我不知道是否有机制来执行此操作,类似于新的.NET新任务并行库中的“任务”中的“Parent”属性。.NET框架线程“血统”
编辑: 进一步调查实际上似乎表明没有位置存储这些信息,所以短缺真正丑陋的黑客,这似乎不可能透明地实现。
因此,我认为我会接受下面的示例代码作为解决问题的最可行(非透明)答案,即使我必须自己寻找替代设计。谢谢:)
系统内部不提供此类功能。你可以很容易地通过父线程的线程启动功能的线程ID:
static class ThreadSpawner
{
[ThreadStatic]
private static int parentThreadId;
public static int ParentThreadId
{
get { return parentThreadId; }
}
private class ThreadInfo
{
public int ParentId;
public Action Method;
}
private static void StartThread(object parameter)
{
var threadInfo = (ThreadInfo)parameter;
parentThreadId = threadInfo.ParentId;
threadInfo.Method();
}
public static void Spawn(Action start)
{
new Thread(StartThread).Start(
new ThreadInfo {
Method = start,
ParentId = Thread.CurrentThread.ManagedThreadId
});
}
}
// Usage:
ThreadSpawner.Spawn(MyMethod);
static void MyMethod() {
Console.WriteLine(ThreadSpawner.ParentThreadId);
}
更糟的是,创建一个.NET线程并不能保证得到一个原生的线程,所以你不能依赖于能够也可以使用P/Invoke来移动线程父级信息。
我知道如果您编写测试代码,您将看到本机线程,但不需要生成它,并且在某些情况下很难猜测它不会。
编辑:无论如何无法通过P/Invoke获取线程父项。
我还没有深入挖掘,希望基于.NET的解决方案基于托管线程......但如果没有其他帮助,我可能会对哪些P/Invoke API提供对本地线程信息的访问感兴趣.. – jerryjvl 2009-05-25 04:43:18
我明白你在这里想要做什么。不幸的是,在我的场景中,我无法控制创建线程的代码是如何实现的。我期望在图书馆里这样做,所以我需要能够弄清楚这个问题,不管线程是如何产生的。 – jerryjvl 2009-05-25 04:41:25