Skip to content

使用线程池

🏷️ C# 学习 C#

由于线程的创建和销毁需要非常大的性能开销,在 WindowsNT 内核的操作系统上,每个进程都会包含一个线程池。线程池由 CLR 管理。

.NET 提供 System.Threading.ThreadPool 类型来提供关于线程池的操作。

常用的有下面 3 个静态方法:

  1. public static bool QueueUserWorkItem;

  2. public static bool QueueUserWorkItem;

  3. public static bool UnsafeQueueUserWorkItem;

示例代码

点击查看代码
csharp
using System;
using System.Threading;

namespace ThreadPoolSample
{
    class Program
    {
        static void Main(string args)
        {
            string taskinfo = "运行 10 秒";
            // 插入一个新的请求到线程池
            bool result = ThreadPool.QueueUserWorkItem(DoWork, taskinfo);
            // 分配线程有可能失败
            if (!result)
            {
                Console.WriteLine("分配线程失败");
            }
            else
            {
                Console.WriteLine("按回车可结束线程");
            }
            Console.Read();
        }

        /// <summary>
        /// 线程的方法
        /// 必须符合 WaitCallback 委托的声明
        /// </summary>
        /// <param name="state"></param>
        private static void DoWork(object state)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("工作者线程的任务是:{0}", state.ToString());
                Thread.Sleep(1000);
            }
        }
    }
}

输出结果

点击查看输出结果

按回车可结束线程
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒
工作者线程的任务是:运行 10 秒

如果在程序运行过程中按下回车键,程序会立即中止。

这说明主线程和插入的工作者线程完全并行,并且线程池中的线程是后台线程的特性。

总结

  1. System.Threading.ThreadPool 类型封装了线程池的操作。

  2. 每个进程都拥有一个线程池,.NET 提供了线程池的管理机制,用户只需要把线程需求插入到线程池中,而不必再理会后续的工作。

  3. 所有线程池中的线程都是后台线程,它们不会阻碍程序的退出。