2009-05-24 82 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