【发布时间】:2010-02-22 22:44:37
【问题描述】:
我正在尝试为我的 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?
}
}
}
}
我想确保我的所有线程都被终止,以便应用程序可以正确关闭并在某些计算过程中关闭也很好。我应该知道这里有什么吗?考虑到我的情况,这种方法好吗?
【问题讨论】:
-
哇!很多好的答案......现在很难选择。我把复选标记给了内特,因为他是第一个,把它从他手里拿走是不公平的。让我们看看投票怎么说。我从你所有的答案中得到了一些有用的东西,所以请投票给你。
-
线程池线程的默认行为和我建议的一样。如果你不在乎你的线程没有完成,我的是最简单的解决方案。显然,其他答案对管理线程有很好的意义,但是您明确指出在计算过程中杀死线程是可以的。
-
我同意你的看法,Nate ;),我不会取消勾选标记,因为这不公平,你给了我最准确、最快速、最简单的答案……我愿意希望其他人得到公平的评价,所以我希望每个人都为所有好的答案投票。
标签: c# multithreading