我正在尋找一種方法來確定它最初產生的其他線程的線程。我不知道是否有機制來執行此操作,類似於新的.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