C# 线程和任务

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

C# 线程和任务

唯有自己强大   2022-05-28 我要评论

线程

线程:对于所有需要等待的操作,例如移动文件,数据库和网络访问都需要一定的时间,此时就可以启动一个新的线程,同时完成其他任务。一个进程的多个线程可以同时运行在不同的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");
        }

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");
        }

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");
        }

注意:使用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();
        }

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们