c# 基于Task简单线程池

该博客介绍了两种多线程处理数据的方法,一种用于无返回值的处理,另一种返回处理后的列表。通过使用`ConcurrentQueue`确保线程安全,并通过设置线程数量和等待标志来控制处理流程。这些方法可以提高数据处理效率。
        /// <summary>
        /// 多线程处理数据(无返回值)
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="list">待处理数据</param>
        /// <param name="action">数据处理方法(有参数无返回值)</param>
        /// <param name="count">处理线程数量</param>
        /// <param name="waitFlag">是否等待执行结束</param>
        public static void RunTask<T>(List<T> list, Action<T> action, int threadCount = 8, bool waitFlag = true)
        {
            ConcurrentQueue<T> queue = new ConcurrentQueue<T>(list);
            Task[] tasks = new Task[threadCount];
            for (int i = 0; i < threadCount; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    T t;
                    while (queue.TryDequeue(out t))
                    {
                        action(t);
                    }
                });
            }
            if (waitFlag)
            {
                Task.WaitAll(tasks);
            }
        }

        /// <summary>
        /// 多线程处理数据(返回处理后列表)
        /// </summary>
        /// <typeparam name="T">数据类型</typeparam>
        /// <param name="list">待处理数据</param>
        /// <param name="func">数据处理方法(有参数有返回值)</param>
        /// <param name="threadCount">处理线程数量</param>
        /// <returns>数据处理后结果</returns>
        public static List<T> RunTask<T>(List<T> list, Func<T, T> func, int threadCount = 5)
        {
            var result = new List<T>();
            ConcurrentQueue<T> queue = new ConcurrentQueue<T>(list);
            Task<List<T>>[] tasks = new Task<List<T>>[threadCount];
            for (int i = 0; i < threadCount; i++)
            {
                tasks[i] = Task.Run<List<T>>(() =>
                {
                    var rList = new List<T>();
                    T t;
                    while (queue.TryDequeue(out  t))
                    {
                        rList.Add(func(t));
                    }
                    return rList;
                });
            }
            Task.WaitAll(tasks);
            for (int i = 0; i < threadCount; i++)
            {
                result.AddRange(tasks[i].Result);
            }
            return result;
        }
### C#中Thread、Task线程池之间的区别 #### 1. Thread `Thread` 是 .NET 中最基础的多线程实现方式。它直接封装了操作系统级别的线程,允许开发者创建并管理独立的线程。通过 `Thread` 类,可以显式地控制线程的行为,例如设置优先级、名称以及进行线程同步等。 - **优点**:提供了对线程的细粒度控制。 - **缺点**:手动管理线程的成本较高,包括线程的启动、停止、异常处理等问题。 - **使用场景**:适用于需要精细控制线程行为的应用场景。 示例代码: ```csharp Thread thread = new Thread(() => { Console.WriteLine("This is a new thread."); }); thread.Start(); ``` #### 2. 线程池(ThreadPool) 线程池是一种优化资源利用的机制,用于管理和复用一组预先创建的工作线程。当有任务需要执行时,这些任务会被分配给线程池中的空闲线程来处理。线程池减少了频繁创建和销毁线程所带来的性能开销。 - **优点**:高效利用系统资源,减少线程创建与销毁的开销。 - **缺点**:无法直接控制具体的线程行为;不适合长时间运行的任务[^4]。 - **使用场景**:适合短时间内的大量并发操作。 示例代码: ```csharp ThreadPool.QueueUserWorkItem(state => { Console.WriteLine("Task executed by thread pool."); }); ``` #### 3. Task `Task` 是在 .NET Framework 4.0 引入的 TPL (Task Parallel Library) 的一部分,它是对线程池的一个高级抽象。`Task` 提供了更简洁的方式来处理异步编程,并支持延续任务、取消令牌、等待和超时等功能。 - **优点**:简化了异步编程模型,支持复杂的任务编排。 - **缺点**:底层依然依赖于线程池或特定调度器,对于某些特殊需求可能不够灵活。 - **使用场景**:适用于需要复杂任务管理和协调的异步编程场景[^2]。 示例代码: ```csharp Task task = Task.Run(() => { Console.WriteLine("This is a background task."); }); ``` ### 对比总结 | 特性 | Thread | ThreadPool | Task | |------|--------|------------|------| | 控制级别 | 高(可完全控制) | 中等(受限) | 低(高度封装) | | 性能开销 | 较高(每次都需要创建/销毁) | 较低(复用已有线程) | 很低(基于TPL优化) | | 易用性 | 复杂 | 简单 | 非常简单 | | 适用范围 | 需要精确控制线程的情况 | 短期任务,批量处理 | 异步编程,复杂任务流 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值