c# - 关闭多线程应用程序

标签 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?
            }
        }
    }
}

我想确保我的所有线程都被终止,以便应用程序可以正常关闭,并且在某些计算过程中关闭也很好。我应该知道这里有什么吗?这种方法适合我的情况吗?

最佳答案

如果您将线程设置为后台线程,它们将在应用程序关闭时被杀死。

myThread.IsBackground = true;

显然,如果您需要线程在关闭前完成,这不是您想要的解决方案。

关于c# - 关闭多线程应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2314861/

相关文章:

c# - 如何通过代码以编程方式将 “Override high DPI scaling” 设置为 “Application”

c# - Mongo 无法使用枚举反序列化类

c# - 将 BeginInvoke 转换为异步/等待

c# - 一个低开销的文件写入过程应该在它自己的线程上吗?

linux - 在多线程 Tomcat 服务器中访问全局变量

java - 单元测试框架 - TestNG 使用可配置值来定义 threadPoolSize

c# - WPF Pressing Enter Key 如何使按钮看起来被按下

c# - 如何对包含表示文件名的字符串的集合进行排序?

java - 异步任务突然完成。调试 View 显示线程在 Threadpoolexecutor.runWorker(ThreadpoolExcutr$Worker) 行 :1094 处停止

java - JTextPane 文本可能由于范围问题而未更新