2009-05-24 62 views
1

我正在寻找一种方法来确定它最初产生的其他线程的线程。我不知道是否有机制来执行此操作,类似于新的.NET新任务并行库中的“任务”中的“Parent”属性。.NET框架线程“血统”

编辑: 进一步调查实际上似乎表明没有位置存储这些信息,所以短缺真正丑陋的黑客,这似乎不可能透明地实现。

因此,我认为我会接受下面的示例代码作为解决问题的最可行(非透明)答案,即使我必须自己寻找替代设计。谢谢:)

回答

2

系统内部不提供此类功能。你可以很容易地通过父线程的线程启动功能的线程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); 
} 
+0

我明白你在这里想要做什么。不幸的是,在我的场景中,我无法控制创建线程的代码是如何实现的。我期望在图书馆里这样做,所以我需要能够弄清楚这个问题,不管线程是如何产生的。 – jerryjvl 2009-05-25 04:41:25

2

更糟的是,创建一个.NET线程并不能保证得到一个原生的线程,所以你不能依赖于能够也可以使用P/Invoke来移动线程父级信息。

我知道如果您编写测试代码,您将看到本机线程,但不需要生成它,并且在某些情况下很难猜测它不会。

编辑:无论如何无法通过P/Invoke获取线程父项。

+0

我还没有深入挖掘,希望基于.NET的解决方案基于托管线程......但如果没有其他帮助,我可能会对哪些P/Invoke API提供对本地线程信息的访问感兴趣.. – jerryjvl 2009-05-25 04:43:18