我想爲我的C#應用程序編寫一個ThreadManager。我創建了幾個線程:
我的文本編寫器的一個線程。
一個線程監視一些統計信息。
多線程執行大量計算(每個核心最多4個線程,並且我在2x四核服務器上運行我的應用程序)。關閉多線程應用程序
我的應用程序一次最多可以運行24小時,因此所有線程都會在開始時創建,並且始終保持應用程序運行的整個時間。
我希望有一個地方可以「註冊」我所有的步驟,當應用程序關閉時,我只需調用一個方法,它會遍歷所有已註冊的線程並關閉它們。
出於這個目的,我設計了以下類:
public class ThreadManager
{
private static Object _sync = new Object();
private static ThreadManager _instance = null;
private static List<Thread> _threads;
private ThreadManager()
{
_threads = new List<Thread>();
}
public static ThreadManager Instance
{
get
{
lock (_sync)
{
if (_instance == null)
{
_instance = new ThreadManager();
}
}
return _instance;
}
}
public void AddThread(Thread t)
{
lock (_sync)
{
_threads.Add(t);
}
}
public void Shutdown()
{
lock (_sync)
{
foreach (Thread t in _threads)
{
t.Abort(); // does this also abort threads that are currently blocking?
}
}
}
}
我想確保我的所有線程都殺了那麼應用程序可以正常關閉,並在某些運算的中間關停就好了太。我應該知道這裏有什麼嗎?鑑於我的情況,這種方法是否合適?
哇! Lot很好的答案...現在很難選擇。因爲他是第一個,所以我給了Nate複選標記,把它從他身上拿走是不公平的。讓我們看看這些票是怎麼說的。我從你的答案中得到一些有用的東西,所以請投票支持你的心。 – Kiril 2010-02-22 23:06:41
線程池線程的默認行爲與我所建議的相同。如果你不關心你的線程沒有完成,我的是最簡單的解決方案。很明顯,其他答案在管理線程方面做得很好,但是你明確指出在計算過程中殺死線程是很好的。 – 2010-02-22 23:14:52
我同意你的看法;),我不打算取消選中標記,因爲這樣做不公平,你給了我最準確,最快速,最簡單的答案......我希望其他人得到他們的公平信用,所以我希望每個人都爲所有的好答案投票。 – Kiril 2010-02-23 00:04:27