2011-02-28 147 views
4

可能重複:
.NET Is there a way to get the parent thread id?如何從子線程或其他線程獲取父線程?

是否有.NET線程之間的任何關係?我迫切需要從實際線程中獲取父線程,並且無法切換這些信息。 有沒有什麼辦法在.NET中獲取父線程或使用Win32 API?

有沒有辦法從其他線程獲取父線程?

+1

你會如何定義「父線程」?你在經營什麼樣的環境?你試圖解決什麼問題? – 2011-02-28 13:54:43

+0

我們需要更多關於您想要達到的信息,以便能夠向您提供您正在尋找的答案。 – 2011-02-28 13:54:55

+8

你應該接受人們會問「你爲什麼需要這個?」這裏有太多的問題是「我怎麼沒有使用太空船來到火星?」我們將需要一些背景來確定你真正需要/想要的東西。 – 2011-02-28 13:55:00

回答

8

.NET不記錄線程之間的父子關係。您需要自行跟蹤這些數據,方法是在創建時將父線程傳遞給子進程。

這就是說,我不可能想象爲什麼你會需要這個。是不是Join從父母或東西足夠好?

我可以理解你可能會因爲「你想做什麼?」這樣的問題而感到沮喪? - 但是如果你讓我們知道你真正的目標是什麼,我們可能會找到一種你沒有想到的更好的方式,但通常情況下。 :)

-2

使用InvokeRequired在主線程中執行一些操作。

+0

......這與問題的關係如何? – bdonlan 2011-02-28 13:54:07

+0

它會在父母編程WinForms並進行一些異步調用時。但是,這又是一次飛躍。 – 2011-02-28 13:57:29

4

在Win32中,線程沒有父線程。線程全部歸過程所有。

3

線程不會固有在.NET框架上有父/子關係。這是由於在Win32中,所有線程都歸進程所有。

你可以通過在你的線程周圍創建一個包裝類來自己強加這個關係。但是,由於信息很少,我不能推薦解決方案。

1

.NET中的線程之間沒有關係。但是,在.NET 4的Task/Task<T>類中存在父子關係,在許多方面,這與直接使用線程相比是更好的併發性方法。

話雖這麼說...

我迫切需要從實際線程獲取父線程,有沒有辦法交接這條信息。

將信息「切換」到線程的主要方法是實現SynchronizationContext。這通常由用戶界面框架完成,以便在該線程內的對象上實現ISynchronizeInvoke(即:Control.Invoke)。這通常不是手動完成的,並且需要一個非常自定義的線程來維護自己的消息泵或正在不斷處理的進程隊列。

我建議考慮將此更改爲生產者/消費者場景,並讓您的「子」線程輪詢新的處理項目。這消除了所有需要了解「父母」的需要 - 因爲任何線程都可以添加到處理隊列中。 BlockingCollection<T>類對於這種情況非常理想。

+0

謝謝,我真的意識到,除了我的問題之外,所有問題都將隨着我深入到我們系統的遺留基礎架構而發生變化。我不需要同步線程,我需要確定在當前線程的直接/間接調用鏈中的程序集,並且如果源自任務的線程創建了工作線程,那麼會受到影響。簡單地說,對我來說沒有幫助。謝謝你的回答。 – 2011-02-28 14:47:43