async/await异步和Task多线程您真的明白了吗?

一、引言

嗯,由于自己的无知和对知识有点一知半解的陋习下,使自己一直纠结于这样的一个问题:究竟什么是异步,在C#中究竟是async定义了异步,还是使用了Task本身就是异步?很明显,在这样的问题下,觉得自己真的有点犯二。原本这样的问题的解释根本不存在,原因是:自己啊,对知识理解不透彻,又怎么可能想明白。所以,经过一番代码运行作为比较,终于明白了其中的意含义,暫抒己见还望路过的大神能够指点一二,万分感谢!

二、什么是异步

异步的含义其实很简单,比如我们定义一段代码,不必前面所有的代码执行完,开始执行某一段代码,就好像,不必等饭熟开始炒菜,大概的意思就是这么一回事,就比如下面这样一段代码,不必等调用的函数执行完了,输出结束,这就是异步!

class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Console.WriteLine("开始");
            WriteAsync();
            Console.WriteLine("结束");
            Console.ReadKey();
        }

        static void WriteAsync()
        {
    
               
            Task.Run(() => {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine($"AsyncTestMethod"+" "+i);
                    Thread.Sleep(10);
                }
            });
        }   
    }

在这里插入图片描述

三、什么是Task

Task确实是一个很神秘的东西,但从根本上说,其实就是开启线程上的任务,即:允许多个任务可以有多个线程(或在同一线程内)进行不必等上一个任务执行完才开始执行下一个任务,很直观的说,就是我在跑步同时不影响我也在听音乐!就好像,我在运行QQ的时候,不影响酷狗也在播放音乐!就比如下面的代码,我在比较值的同时,同时也在对该值得进行输出,二者同时进行!

 class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Task.Run(() => {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine(i + "<3" + " " + (i < 3));
                    Thread.Sleep(10);
                }
            });
            Task.Run(() => {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine($"AsyncTestMethod" + " " + i);
                    Thread.Sleep(10);
                }
            });           
            Console.ReadKey();
        }
    }

在这里插入图片描述

四、async/await和Task异步详解

经过上面的阐述和代码验证,我们终于可以清楚的明白,异步Task(多任务)本身就是两个不同的概念,异步是同时执行多个任务,而Task则是允许多个任务可以在线程内同时进行多任务的同时进行,则是由异步进行,而异步方法,必须为Task<T>

1、不加await修饰

class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Console.WriteLine("开始");
            WriteAsync();
            Console.WriteLine("结束");
            Console.ReadKey();
        }

        static void WriteAsync()
        {
    
    
            Task.Run(() =>
            {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine("T " + i);
                }
            });
            Task.Run(() =>
            {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine("S " + i);
                }
            });

        }

在这里插入图片描述

2、加await修饰

await的作用好比,我们在验证用户登录的情况下,用户名和密码验证通过后,才进行对用户信息完整读取,通过异步之间的await进行线程等待,避免不必要的资源被占用和浪费!

 class Program
    {
    
    
        static void Main(string[] args)
        {
    
    
            Console.WriteLine("开始");
            WriteAsync();
            Console.WriteLine("结束");
            Console.ReadKey();
        }

        static async void WriteAsync()
        {
    
    
            await Task.Run(() =>
            {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine("T " + i);
                }
            });
            await Task.Run(() =>
            {
    
    
                for (int i = 0; i < 10; i++)
                {
    
    
                    Console.WriteLine("S " + i);
                }
            });

        }
    }

在这里插入图片描述

到这里,总算梳理清楚,什么是异步,什么是Task了。但必须注意的一点是,在多个Task进行的情况下,务必要考虑线程安全的问题!好了,今天的分享就到这里,略抒己见,如有错误,还望有路过的高手,能够给予指导!!!

猜你喜欢

转载自blog.csdn.net/qq_42799562/article/details/115035702