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进行的情况下,务必要考虑线程安全的问题!好了,今天的分享就到这里,略抒己见,如有错误,还望有路过的高手,能够给予指导!!!

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
引用中提到了使用async/await必须在async函数的作用域下使用,并且在使用await时要注意语法错误。而引用中介绍了async/await是ES7引入的一种异步编程方式,它提供了使用同步样式的代码异步访问资源的方式,并且不会阻塞线程。使用async/await可以简化异步编程的代码,使其更易读。同时,async/await是基于Promise的,可以通过try-catch来捕获异常。引用中还提到了多个await命令可以统一放在try...catch结构中。根据这些信息,可以得出jquery也可以使用async/await来实现异步操作。 使用jquery实现async/await的方式与使用原生JavaScript的方式基本相同。首先,确保在引入jquery之后在async函数的作用域下进行操作。然后,可以使用$.ajax来发送异步请求,并在需要等待其返回结果时使用await关键字。例如,可以将多个并发请求统一放在try...catch结构中,如下所示: ```javascript async function main() { try { const result1 = await $.ajax({ url: 'url1', method: 'GET' }); const result2 = await $.ajax({ url: 'url2', method: 'GET' }); const result3 = await $.ajax({ url: 'url3', method: 'GET' }); console.log('Final: ', result1, result2, result3); } catch (error) { console.error(error); } } main(); ``` 在上述代码中,使用$.ajax发送了三个并发请求,并使用await关键字等待每个请求的结果。最后,将三个请求的结果输出到控制台。如果发生异常,可以通过try-catch捕获并处理。这样,就可以使用jquery的async/await方式来实现异步操作了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ES7 async/await](https://blog.csdn.net/JunChow520/article/details/103289715)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [12. ES6 async/await 的使用](https://blog.csdn.net/ladymarry/article/details/127929395)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值