C#异步多线程入门(一)

一、什么是线程?

       线程(Thread)是代码的执行序列或者执行路径。线程与进程的概念有一些相似,它类似于一个轻量级的进程:一个操作系统中可以运行多个进程,一个进程内可以运行多个线程。每个应用程序至少运行在一个线程上。当只有一个线程时,称作单线程应用程序,该线程由系统自动创建。例如下面的.Net Core 控制台应用程序Main方法。

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            Console.WriteLine("我是单线程程序");
        }
    }
}

从线程的生命周期来看这个程序的执行过程如下:

每个线程都有一个入口点,上面的程序来说入口点即Main()方法,,执行Main()方法的线程通常被称为主线程(Main Thread),主线程的入口点也是应用程序的起始点。对於单线程程序来说,代码的执行顺序永远是至上而下的。也就是说,控制台中肯定是先输出“Hello World”再输出“我是一个单线程程序”。

二、多线程的好处

1、使用线程可以把占据长时间的程序中的任务放到后台去处理

2、用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

3、程序的运行速度可能加快

4、在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等

上面的程序只是输出了两行文字,所以不会感觉到运行时间上的差距。但是如果程序中某个任务需要很长时间完成,那么后面的执行步骤也得等待这个任务执行完成才能继续执行。举个生活中的例子:我们需要做晚饭,分为煮饭和炒菜两个环节,其中煮饭需要30分钟,而炒菜需要20分钟。用单线程去做的话,必须煮完饭再炒菜,那么就需要50分钟。而用多线程的做法是,先下米煮饭,同时炒菜,那样30分钟饭菜都好了。

using System;
using System.Threading;

namespace StudyThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);//记录开始时间
            cookRice();
            friedDsh();
            Console.WriteLine(DateTime.Now);//记录结束时间
        }
        /// <summary>
        /// 煮饭
        /// </summary>
        public static void cookRice() 
        {
            Console.WriteLine("**********开始煮饭啦**********");
            Thread.Sleep(1000*30);  //让线程睡眠30秒模拟煮饭时间
            Console.WriteLine("**********饭煮好啦**********");
        }
        /// <summary>
        /// 炒菜
        /// </summary>
        public static void friedDsh()
        {
            Console.WriteLine("**********开始炒菜啦**********");
            Thread.Sleep(1000 * 30);  //让线程睡眠20秒模拟炒菜时间
            Console.WriteLine("**********菜炒好啦**********");
        }
    }
}

从运行输出结果可以看出单线程执行,刚好用了一分钟。

三、线程的基本操作

3.1创建新线程

using System.Threading;

System.Threading命名空间下的Thread类提供了线程的基本操作。通过创建一个
Thread对象,并执行它的Start()方法,可以新建并运行一个新的线程。

还是用上面的煮饭炒菜的例子,代码修改如下:

using System;
using System.Threading;

namespace StudyThread
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);//记录开始时间
            ThreadStart ts = new ThreadStart(friedDsh);//新线程的入口
            Thread worker = new Thread(ts);//创建线程对象
            worker.Start();
            cookRice();
            //friedDsh();
            Console.WriteLine(DateTime.Now);//记录结束时间
        }
        /// <summary>
        /// 煮饭
        /// </summary>
        public static void cookRice() 
        {
            Console.WriteLine("**********开始煮饭啦**********");
            Thread.Sleep(1000*30);  //让线程睡眠30秒模拟煮饭时间
            Console.WriteLine("**********饭煮好啦**********");
        }
        /// <summary>
        /// 炒菜
        /// </summary>
        public static void friedDsh()
        {
            Console.WriteLine("**********开始炒菜啦**********");
            Thread.Sleep(1000 * 30);  //让线程睡眠20秒模拟炒菜时间
            Console.WriteLine("**********菜炒好啦**********");
            Console.WriteLine(DateTime.Now);//记录结束时间
        }
    }
}

从运行输出结果可以看出单线程执行,用时是31秒。煮饭和炒菜是同时进行的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章