我想为我的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