.Net6.0系列-2.Net 6及以上异步编程(一)

news/2024/5/19 23:43:23 标签: .net, c#, .netcore

一.异步方法:用async关键字修饰的方法
1.异步方法的返回值一般是Task,T是返回类型,Task,异步方法以Async结尾.
2.异步方法没有返回值,最好声明为非泛型的Task
3.调用异步方法时加上await,即可获取返回T类型的值
4.异步方法的"传染性":一个方法中如果有await调用,则这个方法必须修饰为async
Example:
static async Task(或者void,尽量写Task) Main(string[] args)
{

string filename="E:\Temp\a.txt";
await File.WriteAllTextAsync(filename,"hello");
string s=await File.ReadAllTextAsync(filename);

}
二.异步方法编写

static async Task Main( [] args)
{
	int length=await DownloadHtmlAsync("http://www.baidu.com",@"e:\Temp\a\1.txt");
	Console.WriteLine(length);
}
//下面这种写法是不能使用await的时候的写法这种写法不好,还不如自己写多线程
//.Wait()/.Result不要用
static void Main(string[] args)
{
	Task<int> strLengthT=File.ReadAllTextAsync(@"e:\Temp\a\1.txt");
	int strLength=strLengthT.Result;
	Console.WriteLine(strLength);
	//不能写Async方法也没有返回值,
	//File.WriteAllTextAsync(@"e:\Temp\a\1.txt","aaaaaa").Wait();
}
static async Task<int> DownloadHtmlAsync(string url,string filename)
{
	string html="";
	using(HttpClient httpClient=new HttpClient)
	{
		html=await httpClient.GetStringAsync(url);
		await File.WriteAllTextAsync(filename,html);
	}
	return html.Length;
}

线程池中的异步委托使用:下面是lamda表达式:在lamda表达式前加async修饰就可以使用异步编程
static void Main(string[] args)
{
	ThreadPool.QueueUserWorkItem(async (obj)=>{
		while(true)
		{
			await File.WriteAllTextAsync(@"e:\Temp\a\1.txt","aaaaaaaa");
			Console.WriteLine("xxxxxx");
		}
	});
	Console.Read();
}

三 async与await解密
可用ILSpy反编译器反编译,该代码,可知async的方法会被C#编译器编译成一个类,根据await调用
进行切分为多个状态(swich(){case}),对async方法的调用会被拆分为对MoveNext的调用,await看似等待,经过编译
后,其实没有等待

static async Task Main(string[] args)
{
	using(HttpClient httpClient=new HttpClient())
	{
		string html=await httpClient.GetStringAsync("http://www.baidu.com");
		Console.WriteLine(html);
	}
	string txt ="hello cdc";
	string FileName="E:\temp\1.txt";
	await File.WriteAllTextAsync(FileName,txt);
	Console.WriteLine("写入成功!");
	string s =await File.ReadAllTextAsync(FileName);
	Console.WriteLine("文件内容:"+s);
}

四:async背后的线程切换
await调用的等待期间,.Net会把当前的线程返回会给线程池,等异步方法调用执行完毕之后,
框架会从线程池再取出一个线程来执行后续的代码,如果下面的代码sb很短,则不会切换线程,
在编写代码时应该尽量避免切换线程

static async Task Main(string[] args)
{
	Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
	StringBulider sb=new StringBulider();
	for(int i=0;i<10000;i++)
	{
		sb.Append("cdc");
	}
	await File.WriteAllTextAsync(@"E:\temp\1.txt",sb.ToString());
	Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
}

http://www.niftyadmin.cn/n/98296.html

相关文章

4565: 删除中间的*

描述规定输入的字符串中只包含字母和*号&#xff0c;除了字符串前导和尾部的*号之外,将串中其他*号全部删除输入输入数据包括一串字符串&#xff0c;只包含字母和*&#xff0c;总长度不超过80。输出输出删除中间*后的字符串。样例输入*******A*BC*DEF*G****样例输出*******ABCD…

通用信息抽取技术UIE产业案例解析,Prompt 范式落地经验分享!

想了解用户的评价究竟是“真心夸赞”还是“阴阳怪气”&#xff1f;想快速从多角色多事件的繁杂信息中剥茧抽丝提取核心内容&#xff1f;想通过聚合相似事件准确地归纳出特征标签&#xff1f;……想了解UIE技术在产业中的实战落地经验&#xff1f;通用信息抽取技术 UIE 产业案例…

数据集市与数据仓库的区别

数据仓库是企业级的&#xff0c;能为整个企业各个部门的运作提供决策支持&#xff1b;而数据集市则是部门级的&#xff0c;一般只能为某个局部范围内的管理人员服务&#xff0c;因此也称之为部门级数据仓库。 1、两种数据集市结构 数据集市按数据的来源分为以下两种 &#x…

Vmware17 pro支持MAC系统安装

按照网上说的&#xff0c;通过Unlocker老无法打开vmware 的mac设置原因unlocker版本太低了&#xff0c;真无语&#xff0c;网上基本上的版本都是v2的&#xff0c;&#xff0c;真坑https://github.com/DrDonk/unlocker/releases这里有最新的安装&#xff0c;执行下即可&#xff…

Python 单元测试

测试代码 编写函数或类时&#xff0c;可以为其编写测试单元&#xff0c;通过测试&#xff0c;可以确定代码面对各种输入都能按照要求那样工作&#xff0c;在添加新代码时也可以对其进行测试&#xff0c;确保不会破坏既有程序。 1、测试函数 首先编写一个程序 name_functions…

Protobuf 逆向解析两种方法

Protobuf 逆向解析两种方法一、Protobuf 的特征二、解析.bin文件显示原始数据法一&#xff1a;用 blackboxprotobuf 模块解析法二&#xff1a;使用 protoc 解析工具一、Protobuf 的特征 案例网址 Protocol buffers是一种语言无关、平台无关、可扩展的序列化结构数据的方法&…

vuex(vue的组件库)

Vue.use(Vuex)1.vuex哪些属性&#xff1f;export default new Vuex.Store({state:{全局共享属性 xxx:123}, 页面获取 {{$store.state.xxx}}getters:{针对数据&#xff0c;二次计算 changeStr(state){return state.xxxyyy}},mutations:{存放同步方法},actions:{存放异步方法&am…

软件测试5年,历经3轮面试成功拿下华为Offer,24K/16薪不过分吧

前言 转眼过去&#xff0c;距离读书的时候已经这么久了吗&#xff1f;&#xff0c;从18年5月本科毕业入职了一家小公司&#xff0c;到现在快5年了&#xff0c;前段时间社招想着找一个新的工作&#xff0c;前前后后花了一个多月的时间复习以及面试&#xff0c;前几天拿到了华为的…