c# 指定线程数的多线程操作

多线程操作一直用ThreadPool.QueueUserWorkItem比较多,今天想到用这个方式实现,控制并发线程的数量。

主要思路是:

  1.声明开启的线程数 int threadCount = 2;

  2.创建一个泛型集合List<TaskInfo>  workingList = new List<TaskInfo>(); 需要开启多少个线程,就从Queue里取几个taskInfo,添加到workingList,同时,把TaskInfo.IsBusy置为true.

  3.在子线程中,执行完成时,再把TaskInfo.IsBusy置为false.

  4.在主线程中,循环往workingList中放入TaskInfo 对象, 并通过判断TaskInfo.isBusy, 移除执行完成的TaskInfo对象。

代码如下,如有任何建议,还望不吝赐教。

public class TaskInfo
{
    public bool IsBusy { get; set; }

    public int ID { get; set; }
}

public class Test
{
     public void Work(object obj)
    {
        var taskInfo = obj as TaskInfo;
     //Do something ...
        Thread.Sleep(5000);

        taskInfo.IsBusy = false;
    }

    public void Test_MultyThread()
    {
        int threadCount = 2;

        Queue<TaskInfo> taskQueue = new Queue<TaskInfo>();
        taskQueue.Enqueue(new TaskInfo() { ID = 1 });
        taskQueue.Enqueue(new TaskInfo() { ID = 2 });
        taskQueue.Enqueue(new TaskInfo() { ID = 3 });
        taskQueue.Enqueue(new TaskInfo() { ID = 4 });
        taskQueue.Enqueue(new TaskInfo() { ID = 5 });

        List<TaskInfo> workingList = new List<TaskInfo>();
        while (taskQueue.Count > 0)
        {
            if (workingList.Count < threadCount)
            {
                var taskInfo = taskQueue.Dequeue();
                taskInfo.IsBusy = true;
                workingList.Add(taskInfo);

                Console.WriteLine("Processing ID: {0}", taskInfo.ID);
                ThreadPool.QueueUserWorkItem(new WaitCallback(Work), taskInfo);
            }
            else
            {
                if (workingList.Any(x => !x.IsBusy))
                {
                    workingList.RemoveAll(x => !x.IsBusy);
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("==>     Waiting for free thread ...");
                    Console.ResetColor();

                    Thread.Sleep(1000);
                }
            }
        }
    }
}
时间: 2024-10-12 19:09:48

c# 指定线程数的多线程操作的相关文章

shell爬虫简易脚本(线程数可控)

1.介绍 以机电之家网站为例 经过初步分析,机电之家的数据量较大,并且数据组织规则较为统一,适合以代码方式进行全量爬取. 企业列表URL统一为http://www.jdzj.com/yp_vlist_1_1.html 的模式,变化的仅为其中的数字,而且企业的黄页均为 :http://xxxx.jdzj.com/的模式. 因此,我们的爬取思路采用遍历企业列表,正则匹配获取企业黄页地址,然后逐次从黄页上获取企业相关信息. 2.批量获取黄页地址: #!/bin/bash #trap,捕捉到信号,2表示

使用newFixedThreadpool(size)时,系统线程数超过size。

使用newFixedThreadpool(size)时,设置size = 5,但是线程在执行时,我查看日志,线程的名称出现[task-10],而且有[task-[1~10]的线程名称全都有,程序现在在服务器上能够正常运行,但是这个问题对我很困扰,不是newFixedThreadpool是指定线程数大小吗?为什么还会出现线程名称大于5的情况?求高手解释.

[转载]C# 多线程、控制线程数提高循环输出效率

C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(createCount.Value) / 10 + 1

轻松学会多线程(三)——如何确定线程数

一般情况下,在互联网编程中,我们会使用多线程来抢夺网络资源.那么,线程数量我们如何来确定呢? 我们都知道,线程数量和CPU核数有关.所以有人建议说:线程数为核数的两倍最好. 其实只要这些线程不频繁切换.竞争资源的话.想要最优性能,还是根据具体项目慢慢调试. CPU切不切换我们没法控制,只能提高线程优先级以获取更多的CPU时间. CPU除了处理Java还需要处理N多系统和其他线程,一般而言,多线程编程中,在确保内存不溢出的情况下提升线程数是可以提高CPU中签率的,也就是能提高你的程序处理数据的速度

C# 多线程、控制线程数提高循环输出效率

原文:C# 多线程.控制线程数提高循环输出效率 C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段10条数据. int seed = Convert.ToInt32(createCount.Value) % 10 == 0 ? Convert.ToInt32(createCount.Value) / 10 : Convert.ToInt32(cre

Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数

文章转载:http://blog.snsgou.com/post-793.html 1.查看物理CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l1 2.查看逻辑CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "processor"|wc -l4 3.查看CPU是几核(即,核心数) [[em

Android多线程操作——线程池管理综述

题记-- 难过了,悄悄走一走: 伤心了,默默睡一觉: 优雅不是训练出来的,而是一种阅历: 淡然不是伪装出来的,而是一种沉淀: 时间飞逝,老去的只是我们的容颜: 时间仿佛一颗灵魂,越来越动人: 1.简述: 在多线程的世界中,是那么的神奇 与 高效以及合理: 2.创建线程池实例 官方推荐使用Executors类工厂方法来创建线程池管理,Executors类是官方提供的一个工厂类,里面封装了好多功能不一样的线程池,从而使得我们创建线程池非常的简单:                    3.使用线程池

cpu个数、核数、线程数、Java多线程关系的理解+物理cpu数和cpu核数和逻辑cpu数和vcpu区别

1.cpu个数.核数.线程数.Java多线程关系的理解 URL地址:https://blog.csdn.net/helloworld0906/article/details/905471592.物理cpu数和cpu核数和逻辑cpu数和vcpu区别 URL地址:https://blog.csdn.net/budonglaoshi123/article/details/84325720 原文地址:https://www.cnblogs.com/curedfisher/p/12204102.html

多线程-网络请求线程数设置

自己闲暇时,也曾尝试实现过简单的线程池,对高并发有过预生产的压测和调优,然而一直我都是作为服务提供方在做多线程. 最近,接过一个服务消费方的代码,看过代码,实现上并没有看出问题,每秒也有过千的请求并发效果,但是领导要求完成每秒两万. 凭借我一直的实践和阅读,理论上 线程数 = 2*CPU数时,可以达到一个最优的性能表现. 当下机器配置 12台 8C 机器,理论每台 16线程相对不错了. 按服务方说明,http请求,响应延时 10ms 计算理论值 200ms(tcp握手+延时) ,每秒每个线程可以