c#的线程池,第一次用

本文演示了如何使用C#中的线程池来并行执行多个任务,包括文件处理任务和等待回调方法。通过设置最大线程数并排队用户工作项,展示了线程池管理并发操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static void ThreadFileDeal(object i)
        {


            string strGet = (string)i;
            for (int a = 0; a < 5; a++)
            {
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + strGet);
                Thread.Sleep(1000);
            }
                
        }


        static void WaitCallBackMethod(object param)
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(String.Format("Thread {0} is running", param));
                Thread.Sleep(1000);
            }
        }




        static void Main(string[] args)
        {
            int ncount = 0;
           while(ncount<100)
            {
                ncount++;
                ThreadPool.SetMaxThreads(20, 20);


                ThreadPool.QueueUserWorkItem(WaitCallBackMethod, ncount);//第一个启动的方法
                ThreadPool.QueueUserWorkItem(ThreadFileDeal,"temp");//第二个启动的方法
            }
             Console.Read();


        }
<think>根据用户需求,用户希望使用C#线程池来执行一个打印任务,即打印十句"我正在学习C#视频"。线程池是一种高效管理线程的机制,可以避免频繁创建和销毁线程的开销。在C#中,我们可以使用`ThreadPool.QueueUserWorkItem`方法将任务加入线程池队列。 但是,由于用户需要打印十次,我们有两种方式: 1. 将一个任务(其中包含循环打印10次)加入线程池。 2. 将十个独立的任务(每个任务打印一次)加入线程池。 考虑到线程池适合执行短小的任务,而且打印一句话是非常快速的操作,我们可以选择第二种方式,即提交10个独立的任务。但是,这样可能会创建10个任务,而线程池会根据情况决定同时执行几个。不过,由于任务量小,这样做是可行的。 然而,根据引用[4]中提到的`ThreadPool.QueueUserWorkItem`方法,我们可以传递一个委托,并在委托中执行打印操作。另外,我们也可以使用Task Parallel Library (TPL)(如引用[2][3]中提到的)来实现,但用户明确要求使用线程池,所以我们使用`ThreadPool.QueueUserWorkItem`。 注意:由于线程池中的线程是后台线程,主线程必须等待所有任务完成,否则程序可能提前退出。我们可以使用`ManualResetEvent`或`CountdownEvent`来等待所有任务完成,但考虑到简单性,我们可以使用`Thread.Sleep`来等待一段时间(不推荐,因为无法确定任务执行时间)或者使用同步机制。 这里我们使用`CountdownEvent`来等待所有任务完成,因为这是比较现代且推荐的方式。 步骤: 1. 创建一个`CountdownEvent`实例,初始计数为10。 2. 循环10次,每次使用`ThreadPool.QueueUserWorkItem`提交一个任务。 3. 在每个任务中,打印语句,然后调用`CountdownEvent`的`Signal`方法(减少计数)。 4. 主线程调用`CountdownEvent`的`Wait`方法等待所有任务完成。 但是,引用[4]中提到了`ThreadPool.QueueUserWorkItem`可以传递参数,我们可以将`CountdownEvent`作为状态对象传递给每个任务,这样每个任务完成后就可以通知主线程。 另外,我们也可以使用更高级的Task类(如引用[2][3]),但用户要求线程池,所以我们使用基础线程池方法。 代码实现如下:</think>在C#使用线程池执行打印任务,可以通过`ThreadPool.QueueUserWorkItem`方法实现。以下是完整代码示例: ```csharp using System; using System.Threading; class Program { static void Main() { // 使用CountdownEvent同步任务(初始计数=10) using (CountdownEvent countdown = new CountdownEvent(10)) { for (int i = 1; i <= 10; i++) { // 将任务加入线程池队列 ThreadPool.QueueUserWorkItem(state => { // 打印任务(带任务编号) Console.WriteLine($"任务{(int)state}: 我正在学习C#视频"); // 标记任务完成 countdown.Signal(); }, i); // 传递任务编号参数 } // 等待所有任务完成 countdown.Wait(); Console.WriteLine("所有任务执行完毕!"); } } } ``` ### 关键点解析: 1. **线程池任务提交** 使用`ThreadPool.QueueUserWorkItem`将任务加入线程池队列,线程池自动分配空闲线程执行任务[^4]。 2. **参数传递** 通过方法第二个参数(`i`)传递任务编号,在委托中通过`state`参数接收(需强制转换类型)[^4]。 3. **任务同步** `CountdownEvent`确保主线程等待所有任务完成: - `countdown.Wait()`:阻塞主线程直到计数器归零 - `countdown.Signal()`:每个任务完成后减少计数器[^3] 4. **输出示例**: ``` 任务3: 我正在学习C#视频 任务1: 我正在学习C#视频 任务4: 我正在学习C#视频 ... 任务10: 我正在学习C#视频 所有任务执行完毕! ``` > 注:任务执行顺序可能随机,因线程调度而异 ### 注意事项: 1. 线程池适合**短时任务**,长时间任务需单独创建线程[^1] 2. 线程池线程默认为**后台线程**,主线程结束时自动终止[^3] 3. 可通过`ThreadPool.SetMinThreads()`调整初始线程数优化性能[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值