• C#开启线程的四种方式


    1.异步委托开启线程

    复制代码
        public class Program
        {
            public static void Main(string[] args)
            {
                Action<int, int> a = add;
                a.BeginInvoke(3, 4, null, null);
                Console.WriteLine("执行线程");
                Console.ReadKey();
            }
            static void add(int a, int b)
            {
                Console.WriteLine(a + b);
            }
        }
    复制代码

    2.通过Thread类开启线程

    复制代码
        public class Program
        {
            public static void Main(string[] args)
            {
                Thread t1;
                Thread t2;
                t1 = new Thread(SetInfo1);
                t2 = new Thread(SetInfo2);
                t1.Start();
                //线程睡眠
                //t1.Join(1000);
                //挂起线程
                t1.Suspend();
                //继续执行线程
                t1.Resume();
                //结束线程
                //t1.Abort();
    
                t2.Start();
                Console.ReadKey();
            }
            //奇数线程
            public static void SetInfo1()
            {
                for (int i = 0; i < 100; i++)
                {
                    if (i % 2 != 0)
                    {
                        Console.WriteLine("奇数为" + i);
                    }
                }
            }
            //偶数线程
            public static void SetInfo2()
            {
                for (int i = 0; i < 100; i++)
                {
                    if (i % 2 == 0)
                    {
                        Console.WriteLine("偶数为" + i);
                    }
                }
            }
        }
    复制代码

    3.通过线程池开启线程

    复制代码
    //线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池; 每排入一个工作函数,就相当于请求创建一个线程;
        //线程池的作用:
        //1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
        //2、如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止
        public class Program
        {
            public static void Main(string[] args)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "hjh" });
                Console.ReadKey();
            }
            public static void TestThreadPool(object state)
            {
                string[] arry = state as string[];//传过来的参数值
                int workerThreads = 0;
                int CompletionPortThreads = 0;
                ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
                Console.WriteLine(DateTime.Now.ToString() + "---" + arry[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
            }
        }
    复制代码

    4.通过任务Task开启线程

    复制代码
    public class Program
        {
            public static void Main(string[] args)
            {
                Task task = new Task(DownLoadFile_My);
                task.Start();
                Console.ReadKey();
            }
            static void DownLoadFile_My()
            {
                Console.WriteLine("开始下载...线程ID:"+Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(500);
                Console.WriteLine("下载完成!");
            }
        }
    复制代码
  • 相关阅读:
    RabbitMQ学习之spring-amqp的重要类的认识
    RabbitMQ学习之ConntectionFactory与Conntection的认知
    (转) RabbitMQ学习之远程过程调用(RPC)(java)
    (转) RabbitMQ学习之延时队列
    (转)RabbitMQ学习之消息可靠性及特性
    (转)RabbitMQ学习之exchange总结
    (转)RabbitMQ学习之Headers交换类型(java)
    心得体悟帖---200223(你决定玩游戏的那一刻开始,你就要做好花费大几个小时的准备)
    范仁义css3课程---44、弹性盒子(flex)实例
    心得体悟帖---200223(视频变短,于录课于观众都是好事)
  • 原文地址:https://www.cnblogs.com/zxdz/p/13686391.html
Copyright © 2020-2023  润新知