2014-06-06 60 views
7

在Stack Overflow問題和一些Google搜索問題上搜索後,我仍然沒有得到它。我知道你可以使用「Thread.isAlive()」方法檢查單個線程是否正在運行,但是我想檢查一個特定的「FooThread」是否仍然在當前進程的所有正在運行的線程之間運行,如果沒有,請調用啓動它的方法。從ProcessThreadCollection獲取正在運行的線程名稱

//somewhere in the code, on another Project/DLL inside solution 
private void FooThreadCaller() 
{ 
    Action act =() => fooFunction(); 
    Thread t = new Thread(new ThreadStart(act)); 
    t.Name = "FooThread"; 
    t.Start(); 
} 
//... 
Process proc = System.Diagnostics.Process.GetCurrentProcess(); 
ProcessThreadCollection threads = proc.Threads; 
bool ThreadExists = false 
foreach (ProcessThread item in threads) 
{ 
    // if item.Name == "FooThread", then ThreadExists = true... 
    // so, if !ThreadExists then call FooThreadCaller() and so on. 
} 
//... 

由於ProcessThread類沒有一個 「名稱」 屬性(如System.Threading.Thread一樣),但只有ID,我只知道線程名(「FooThread 「)不是ID,我如何檢查」FooThread「是否正在運行/活着?

預先感謝您

+1

即使這是可能的,它不會是一個好主意。如果線程剛剛退出,您會認爲它仍在運行。這本質上是活潑的。跟蹤這些信息。當FooThread關閉時,不要。當它開始時,請注意。 – usr

+2

你正在做一些非常非常錯誤的事情。任何「一個仍在運行測試的線程」都是沒用的,它可能不會在納秒後運行。好東西它不起作用。 –

+2

這些評論很棒,但值得指出的是OP實際上檢查線程是否*運行。 – Slider345

回答

5

正如在其他答案中所提到的,ProcessThread和Thread對象是不同的。你的dll創建它自己的Thread對象,但是它會拋棄它對該對象的引用。然後稍後您將查詢該線程的操作系統(通過System.Diagnostics),並期待您之前作爲該線程的創建者具有相同級別的訪問權限。

相反,您應該在創建它們時保存對線程對象的引用。也許你的DLL可以實現一個公共的靜態集合對象,然後你可以在創建它們時添加線程對象。

然後在你的dll外面,你可以遍歷集合並檢查每個線程的名稱和狀態。

+1

謝謝@ Slider345。我會檢查一下。 –

2

我不認爲有一種方法可以做到這一點。 A ProcessThread代表OS線程。 A Thread代表應用程序內的管理的線程。兩者之間並沒有真正的關係。此外,ThreadProcessThread的映射不是1:1,因爲ProcessThread可以表示多個Thread

3

ProcessThread代表操作系統級別的線程,而Thread代表.Net管理的線程。操作系統級別的線程沒有名稱而是唯一的ID(就像進程一樣)。

而不是檢查當前線程的列表如果您的線程仍在運行,您可能應該更改您的代碼的邏輯。例如,您可以保留一個包含線程狀態的布爾值,並在開始/結束時更新它。

相關問題