C#多线程

124 阅读2分钟

线程使用

//获取当前线程
    Thread t = Thread.CurrentThread;
    Console.WriteLine(t.Name)
//开启线程
Thread childThread = new Thread(new ThreadStart(要执行的方法【不加()调用】))
childThread。Start();

异步线程例子

public static void AsyncTask()
    {
        //创建多线程列表(用来存放多个线程)
        List<Task> TaskList = new List<Task>();
        // 创建线程委托
        TaskFactory taskFactory = Task.Factory;

        for (var i = 0; i< 3; i++)
        {    
            //通过委托创建一个线程去执行
            Task tf = taskFactory.StartNew(() => {
                for (var j = 0; j < 10; j++)
                {
                    //线程等待1s
                    Thread.Sleep(1000);
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + ":" + j.ToString());
                }
            });
            //将线程添加进线程list
            TaskList.Add(tf);
        }
        //等待list中的所有线程结束。
        Task.WaitAll(TaskList.ToArray());
    }
    
    

线程池

定义

线程池其实是一个线程队列,只是创建跟开启不需要你管,C#已经帮你封装好了。

该列表由通过ThreadPool类托管,这个类会在需要时增减池中线程的线程数,直到最大的线程数, 池中的最大线程数是可配置的。在双核CPU中,默认设置为1023个工作线程和1000个I/O线程。 也可以指定在创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。如果有 更多的作业要处理,线程池中线程的个数也到了极限,最新的作业就需要排队,且必须等待线程 完成其他任务

例子

public static void poolTask()
    {
        for (var i = 0; i < 10; i++)
        {
            //通过ThreadPool.QueueUserWorkItem()将任务添加到线程池中
            //两个参数
            //1. new WaitCallback()实例对象
            //2. 将 i 以Object类型传入ProcessFile
            ThreadPool.QueueUserWorkItem(new WaitCallback(ProcessFile), i);
        }
    }
    public static void ProcessFile(Object e)
    {
        
        for (var i = 0; i < 10; i++)
        {
            Thread.Sleep(1000);
            Console.WriteLine(i);
        }
            
    }

开启线程池最大数量

线程池最多管理线程数量=“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU, 那么CLR线程池的容量默认上限便是1000

通过线程池创建的线程默认为后台线程,优先级默认为Normal

在什么情况下使用线程池

1.单个任务处理的时间比较短 ,一直检测的任务并不适合假如线程池, 应该是用Thread类创建一个新的线程。

2.需要处理的任务的数量大