目录
  • 线程
    • 一,使用Thread类启动线程和数据传输
    • 二,线程池ThreadPool类
  • 任务
    • 一,创建并启动任务
    • 二,连续任务
    • 三,资源冲突问题
  •  总结

    线程

    线程:对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的CPU上或多核CPU的不同内核上。

    一个应用程序启动时,会启动一个进程(应用程序的载体),然后进程会启动多个线程。

    一,使用Thread类启动线程和数据传输

    使用Thread类可以创建和控制线程,Thread构造函数是一个无参无返回值的委托类型。

    1️⃣对Thread传入一个无参无返回类型的方法-ThreadStart。

        public delegate void ThreadStart();

    实例:

            static  void test()
            {
                Console.WriteLine("test is start");
                Console.WriteLine("test is running");
                Thread.Sleep(3000);
                Console.WriteLine("test is completed");
            }
    
            static void Main(string[] args)
            {
                Thread th = new Thread(test);
                th.Start();
                Console.WriteLine("main is completed");
            }

    C#中Thread(线程)和Task(任务)实例详解

    2️⃣对Thread传入一个匿名方法(或lambda表达式)。用于传入的方法代码简单的情况

            static void Main(string[] args)
            {
                //lambad表达式
                Thread th = new Thread(()=> {
                    Console.WriteLine("子线程1-ID:" + Thread.CurrentThread.ManagedThreadId);
                });
                th.Start();
                //匿名方法
                Thread th2 = new Thread(delegate ()
                {
                    Console.WriteLine("子线程2-ID:" + Thread.CurrentThread.ManagedThreadId);
                });
                th2.Start();
                Console.WriteLine("main is completed");
            }

    C#中Thread(线程)和Task(任务)实例详解

    3️⃣对Thread传入一个无返回值有参方法-ParameterizedThreadStart,该参数只能是object类型且只能有一个参数。

        public delegate void ParameterizedThreadStart(object? obj);

    实例:

            static void download(object o)
            {
                string str = o as string;
                Console.WriteLine("地址:" + str);
            }
            static void Main(string[] args)
            {
                Thread th = new Thread(download);
                th.Start("http://baidu.com");
                Console.WriteLine("main is completed");
            }

    C#中Thread(线程)和Task(任务)实例详解

    注意:使用as进行强制类型转换 成功会正确输出,失败会输出null。

    以上数据传输的方法都是基于静态变量进行传输的,但是定义过多静态变量会导致多个线程访问同一个静态变量,造成资源冲突。

    静态变量虽然方便访问,但是静态的一般都是公共的,容易混乱。

    4️⃣对Thread传入一个无返回值多个参数的方法(定义一个结构体),但是不能用as强制转换。

            public struct data
            {
                public string message;
                public int age;
            }
            static void download(object o)
            {
                data str = (data)o;//强制类型转换
                Console.WriteLine("信息:" + str.message);
                Console.WriteLine("年纪:" + str.age);
            }
            static void Main(string[] args)
            {
                data da = new data();
                da.message = "sss";
                da.age = 3;
                Thread th = new Thread(download);
                th.Start(da);
                Console.WriteLine("main is completed");
            }

    由于结构体是值类型,不能为null,因此不能用as进行强制类型转换。

    5️⃣通过自定义类传递数据(即将通过线程调用一个类的成员方法)

    先创建一个download类:

        class downLoad
        {
            public string URL { get; private set; }
            public string Message { get; private set; }
            //构造函数
            public downLoad(string uRL, string message)
            {
                URL = uRL;
                Message = message;
            }
            //下载方法
            public void  load()
            {
                Console.WriteLine("从" + URL + "获取信息:" + Message);
            }
        }

    在主程序中将该类的成员方法传入Thread中:

       static void Main(string[] args)
            {
                var download = new downLoad("www.baidu.com", "mp4");
                Thread th = new Thread(download.load);
                th.Start();
                Console.WriteLine("main is completed");
                Console.ReadKey();
            }

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。