2015-10-30 44 views
2

如果你已經做了一些類似有沒有辦法通過線程名稱查詢C#應用程序內的正在運行的線程?

Thread logSend = new Thread(() => senddat.SendLoggedData()); 
logSend.Priority = ThreadPriority.AboveNormal; 
logSend.Name = "BackLogThread"; 
logSend.IsBackground = false; 
logSend.Start(); 

您可以簡單地在以後驗證,從另一個線程,存在與"BackLogThread"當前正在運行的名字一個線程?

我不想對線程做任何事情,我只是想查詢我的應用程序中的線程,看看是否有一個具有該特定名稱的線程。

編輯:

至於那被要求與此相關的一個另一個問題,該解決方案是可行的,但它是一個有點多了什麼,我問。這個例子中的人想要知道很多關於線程的信息,例如他們的優先級等,以便記錄信息。如果有任何線程在運行,並且名稱"BackLogThread"正在運行,我最多隻需要返回true

+7

您可以只存儲您所創建的線程的引用。 –

+0

[在.NET中獲取當前活動託管線程的列表?]可能的副本(http://stackoverflow.com/questions/1825882/getting-list-of-currently-active-managed-threads-in-net) –

+0

I希望有一個比我的線程類或類似的類更簡單的解決方案。 .NET真的沒有任何可以返回當前活動線程列表的東西? – Justin

回答

1

據我所知,這是不可能的,因爲沒有辦法讓C#中的所有託管線程。但是您可以手動將它們添加到池中並稍後檢索它們。

池/註冊表可以是這樣的:

public class ThreadRegistry 
{ 
    private static ThreadRegistry instance; 
    private readonly object syncRoot = new object(); 
    private readonly IDictionary<string, Thread> threads = new Dictionary<string, Thread>(); 

    private ThreadRegistry() 
    { 
    } 

    public static ThreadRegistry Instance => instance ?? (instance = new ThreadRegistry()); 

    public Thread this[string name] 
    { 
     get 
     { 
     lock (this.syncRoot) 
     { 
      return this.threads[name]; 
     } 
     } 
    } 

    public void Register(Thread thread) 
    { 
     lock (this.syncRoot) 
     { 
     this.threads.Add(thread.Name, thread); 
     } 
    } 

    public bool ThreadExists(string name) 
    { 
     lock(this.syncRoot) 
     { 
     return this.threads.ContainsKey(name); 
     } 
    } 
} 
+0

我建議的唯一改變是因爲線程是「全局事物」使得整個類都是靜態的。 –

+0

@ScottChamberlain是的,可能是一個解決方案。但是,如果您想要多個註冊表,則限制要使用的類。另一件事是,你必須使用靜態getter而不是索引器。 –

+0

這是一個很好的解決方案,但我會選擇更簡單的東西,我想可能是靜態布爾坐在某個地方,甚至創建一個空文件並檢查它是否存在而不是啓動另一個線程,因爲它不會經常發生。 – Justin

相關問題