关闭多线程应用程序

Kir*_*ril 8 c# multithreading

我正在尝试为我的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?
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想确保我的所有线程都被杀死,以便应用程序可以正常关闭,并在一些计算过程中关闭也很好.我应该知道这里有什么吗?鉴于我的情况,这种做法是否合适?

Nat*_*ich 16

如果将线程设置为后台线程,则在关闭应用程序时将终止它们.

myThread.IsBackground = true;
Run Code Online (Sandbox Code Playgroud)

显然,如果你需要在关机前完成线程,这不是你想要的解决方案.


Eri*_*ert 14

当其他所有方法都失败时,您就会执行中止线程.这是一件危险的事情,你应该只做最后的手段.执行此操作的正确方法是创建线程逻辑,以便每个工作线程在主线程为其提供关闭自身的命令时快速正确地响应.

巧合的是,这是我本周博客的主题.

http://blogs.msdn.com/ericlippert/archive/2010/02/22/should-i-specify-a-timeout.aspx