C#学习系列相关之多线程(四)----async和await的用法

news2024/11/18 14:44:04

一、async、await用法的作用

        async用法主要是用来作为修饰符将方法作为异步方法使用,await关键字只用作为在异步方法才能使用,也就是只有当方法有async修饰后,才能在方法中使用await,await后跟Task新的任务启动。(await和async是配对使用)

二、async、await用法实例 

第一个关键点:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程test1005
{
    public delegate void test(string s1);
    class Program
    {
         static void Main(string[] args)
        {
            test();
            for (int i = 0; i < 400; i++)
            {
                Console.Write(0);
            }
            Console.Read();
 
        }
        public async static void test()
        {
            for (int i = 0; i < 300; i++)
            {
                Console.Write(1);
            }
            await Task.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                }
            });
            for (int i = 0; i < 300; i++)
            {
                Console.Write(3);
            }
        }

    }
}

 

        await的核心作用:如上述代码当中,我们在test函数中使用Task.Run开启新线程后,主线程和支线程交替执行,也就是输出结果为1,然后2和3交替输出,最后输出0,只是在函数内部开启支线程,并没有跳出函数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程test1005
{
    public delegate void test(string s1);
    class Program
    {
         static void Main(string[] args)
        {
            test();
            for (int i = 0; i < 1000; i++)
            {
                Console.Write(0);
            }
            Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            Console.Read();
 
        }
        public async static void test()
        {
            for (int i = 0; i < 300; i++)
            {
                Console.Write(1);
            }
            Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);
             Task.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                }
                Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            });
            for (int i = 0; i < 300; i++)
            {
                Console.Write(3);  
            }
            Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);
        }

    }
}

运行结果为:

在添加await后,当输出2的时候,会跳出test函数,2和0交替输出,等待Task.run运行完,再继续执行函数后的内容,输出结果也就是1,2和0交替输出,最后再输出3,如果0的数量比较多,则0和3也会交替输出!

总结:test中的代码在await以前的代码都是在主函数的线程中输出,但是在await以后的代码会在Task.Run的线程中运行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程test1005
{
    public delegate void test(string s1);
    class Program
    {
         static void Main(string[] args)
        {
            test();
            for (int i = 0; i < 1000; i++)
            {
                Console.Write(0);
            }
            Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            Console.Read();
 
        }
        public async static void test()
        {
            for (int i = 0; i < 300; i++)
            {
                Console.Write(1);
            }
            Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                }
                Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            });
            for (int i = 0; i < 300; i++)
            {
                Console.Write(3);  
            }
            Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);
        }

    }
}

运行结果如图:

 

提示:本人准备建立一个技术交流群,会将日常学习工作中遇到的问题和解决方案进行分享,同时也会将代码和学习资料上传进去,有什么不懂的问题可以咨询我!+v:SJS66-12

生活所迫打个广告,本人也代购莆田鞋,不是中间商,工厂直接取货,价格优惠质量保证,都是我自己前去挑选,可以视频选购验货!!希望大家支持!!!赚点生活费!!!+v:SJS66-12
 

第二个关键点:

await会返回一个结果,返回的结果类型是Task<resut>类型,当我们主函数需要该结果的result的时候,我们的代码会等待函数全部完成后才会继续执行。 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 线程test1005
{
    public delegate void test(string s1);
    class Program
    {
         static void Main(string[] args)
        {
            var tt=test();
            for (int i = 0; i < 1000; i++)
            {
                Console.Write(0);
            }
            Console.WriteLine("0的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(tt.Result);
            for (int i = 0; i < 1000; i++)
            {
                Console.Write(8);
            }
            Console.Read();
 
        }
        public async static Task<int> test()
        {
            for (int i = 0; i < 300; i++)
            {
                Console.Write(1);
            }
            Console.WriteLine("1的支线程号为" + Thread.CurrentThread.ManagedThreadId);
             var result =await Task<int>.Run(() =>
            {
                for (int i = 0; i < 300; i++)
                {
                    Console.Write(2);
                }
                Console.WriteLine("2的支线程号为" + Thread.CurrentThread.ManagedThreadId);
                return 10;
            });
            for (int i = 0; i < 300; i++)
            {
                Console.Write(3);  
            }
            Console.WriteLine("3的支线程号为" + Thread.CurrentThread.ManagedThreadId);
            return result;
        }

    }
}

上述代码中当主函数中需要tt.result时,主函数代码会等待test函数运行完返回result结果后再继续执行后续代码。

运行结果为:

提示:async修饰的函数类型只有三种,void类型、Task和Task<T>!!!

Task.Run的单独返回类型为内部运行函数的返回值T,但await修饰后的返回值为Task<T>

参考文献:

C# async / await 用法_c# await_熊思宇的博客-CSDN博客 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库技术笔记(5)

聚合函数&#xff1a; count(): 统计某种数据的数量 sum(): 统计某种数据的总和 max(): 某种数据的最大值 min(): 某种数据的最小值 avg(): 某种数据的平均值 排序的用法 : 关键字 order by 升序 : ASC &#xff08;从小到大排序&#xff09; 默认为升序 降序 : DESC…

基于拉丁超立方法的风光场景生成与削减

代码链接&#xff1a;基于拉丁超立方法的风光场景生成与削减 摘要&#xff1a;与蒙特卡洛法不同&#xff0c;拉丁超立方采样改进了采样策略能够做到较小采样规模中获得较高的采样精度&#xff0c;属于分层抽样技术&#xff0c;设定风光出力遵从正态分布normrnd&#xff0c;从而…

d3dcompiler_43.dll是什么文件?缺失d3dcompiler_43.dll文件修复与解决方法

今天我要和大家分享的是关于d3dcompiler_43.dll丢失的解决方法。我相信很多网友在使用电脑时都遇到过这个问题&#xff0c;那么接下来就让我们一起来探讨一下如何解决这个问题吧&#xff01; 首先&#xff0c;让我们来了解一下d3dcompiler_43.dll文件的总体介绍。d3dcompiler_…

天津权威大数据培训机构 数据分析师的就业薪资多少?

中国大数据产业起步晚&#xff0c;发展速度快&#xff0c;物联网、移动互联网的迅速发展&#xff0c;使数据产生速度加快、规模加大&#xff0c;迫切需要运用大数据手段进行分析处理&#xff0c;提炼其中的有效信息。 学大数据可就业的行业 随着大数据技术的普及和应用&#…

推进高校学生党建工作数字化建设的思考

高校学生党建工作数字化建设是指利用现代信息技术手段&#xff0c;对高校学生党建工作进行全面、深入的改革和创新&#xff0c;以推进学生党员教育管理服务工作的现代化和精细化发展。 下面将从以下几个方面对高校学生党建工作数字化建设进行详细介绍。 一、背景分析 随着信…

“中式汉堡”塔斯汀圈粉受众的秘诀是什么?

在近几年的餐饮品牌中&#xff0c;塔斯汀堪称逆势扩张的典范&#xff0c;作为国人自己的汉堡品牌&#xff0c;它历经十一年的发展历程&#xff0c;为什么塔斯汀能在一众肯德基、麦当劳中异军突起&#xff0c;圈粉无数人&#xff1f;下面就让媒介盒子为你揭秘&#xff01; 一、 …

使用vlc获取海康威视视频流

1.下载相关软件 1.1海康威视官网-服务支持-工具软件-设备网络搜索 下载地址&#xff1a; https://www.hikvision.com/cn/support/tools/hitools/注意&#xff1a;必须跟摄像头在同一个局域网下才可以使用设备网络搜索工具&#xff0c;才能使用vlc获取到视频流。 1.2下载VLC …

2023最新版Android逆向教程——第2天:dex反编译工具的安装和使用

目录 一、jadx的安装和使用1.1 jadx 的简介1.2 jadx 的安装1.3 jadx 的命令1.4 jadx-gui 的使用方法1.5 常见问题 二、gda的安装和使用三、JEB的安装和使用3.1 JEB的简介3.2 JEB的安装3.3 JEB实战 每个 Android App 都有对应的安装包&#xff0c;是以 apk 为名字后缀的文件&…

掌握 Git:代码版本控制的基本步骤(强力推荐的工具)

fairleevivobook:~/CLionProjects/SDL_SLAM$ git init提示&#xff1a;使用 master 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 提示&#xff1a;配置使用初始分支名&#xff0c;并消除这条警告&#xff0c;请执行&#xff1a; 提示&#xff1a; 提示&…

通过Node.js获取高德的省市区数据并插入数据库

通过Node.js获取高德的省市区数据并插入数据库 1 创建秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 获取数据并插入2.1 创建数据库连接工具2.2 请求数据2.3 数据处理2.4 全部代码 3 还可以打印文件到本地 1 创建秘钥 1.1 登录高德地图开放平台 打开开放平…

使用Python采集京东商品评论并保存至本地

不知道各位网购的时候&#xff0c;是否会去留意商品评价&#xff0c;有些小伙伴是很在意评价的&#xff0c;看到差评就不想买了&#xff0c;而有些小伙伴则是会对差评进行理性分析&#xff0c;而还有一类人不在乎这个。京东作为中国最大的电商平台之一&#xff0c;拥有大量的商…

如何使用ChatGPT编写更好的代码

生成代码是ChatGPT和其他遵循指令运行的大型语言模型(LLM)一个功能强大的应用。如果得到正确的提示&#xff0c;大型语言模型(LLM)可以生成程序员可能需要数小时才能编写的代码。 然而&#xff0c;大型语言模型(LLM)并不能完成程序员的所有工作。他们无法分解复杂的问题&#x…

学生用RockyLinux9.2模板虚拟机说明

“RockyLinux9.2”模板虚拟机下载地址 链接&#xff1a;https://pan.baidu.com/s/1xcakszIQ7Kp9Nw_NA9Znlg?pwdqzmm 提取码&#xff1a;qzmm 1.模板机是基于“Rocky-9.2-x86_64-minimal.iso”安装 2.模板机是2023.10.10执行dnf update && dnf upgrade更新和升级软件…

Unity_相机灵活跟随角色移动

每日一句&#xff1a;慢慢改变&#xff0c;慢慢成长&#xff0c;慢慢适应&#xff0c;慢慢优秀 目录 角色旋转、移动类 相机跟随人物移动类 角色旋转、移动类 /*旋转刚体&#xff0c;位移的动画驱动移动*/ using System.Collections;using System.Collections.Generic;using…

一套完整的软件测试面试流程(面试题),这些题你真的都能答上吗?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自我介绍 2、…

外汇天眼:外汇交易商常见黑心手法大公开!投资务必留意这5种骗局

众所周知&#xff0c;外汇市场无论在交易量、流动性方面都是世界之最&#xff0c;如今随着网络科技愈来愈发达&#xff0c;任何人都能通过手机使用全球的经纪商&#xff0c;随时随地在线上进行外汇保证金交易。 然而&#xff0c;市面上充斥各种黑平台与假券商&#xff0c;投资人…

神经网络中卷积和池化的区别

1、什么叫卷积&#xff1f; 卷积层是用一个固定大小的矩形区去席卷原始数据&#xff0c;将原始数据分成一个个和卷积核大小相同的小块&#xff0c;然后将这些小块和卷积核相乘输出一个卷积值&#xff08;注意这里是一个单独的值&#xff0c;不再是矩阵了&#xff09;。 卷积的…

智能合约漏洞,价值 5200 万美元的 Vyper 漏洞攻击原理分析

智能合约漏洞&#xff0c;价值 5200 万美元的 Vyper 漏洞攻击原理分析 7 月 30 日&#xff0c;因为 Vyper 部分版本中的漏洞&#xff0c;导致 Curve、JPEG’d 等项目陆续受到攻击&#xff0c;损失总计超过 5200 万美元。 Safful 对此事件第一时间进行了技术分析&#xff0c;并…

WebDAV之π-Disk派盘 + 书藏家

书藏家是一款书籍收藏的软件,对于喜欢阅读书籍的用户来说非常友好,记录你所阅读的书籍内容,对你所阅读的书籍内容进行全方位的管理,并且支持多种录入的方式,不管是实体书籍还是网络书籍都能够进行更为有效的管理;内置WebDAV 模块,更加便利的整理自己的文件资源;书藏家的…

三维模型3DTile格式轻量化云端处理技术方法分析

三维模型3DTile格式轻量化云端处理技术方法分析 在现代的地理信息系统 (GIS) 中&#xff0c;3D Tiles 是一种很重要的数据格式&#xff0c;用于存储和传输大规模地理空间数据。然而&#xff0c;由于其数据密度高&#xff0c;传输和加载过程中非常消耗资源&#xff0c;因此需要采…