一、为什么要使用异步编程?.NET Core时代为什么很多方法都支持异步?
1、为什么要使用异步编程?
异步可以快速响应用户界面。
对于不需要单独再开一个线程的背景下,可以发起异步,等待回调。因为线程的创建和销毁是昂贵的。
2、回答了第一个问题,第二个问题答案也就迎刃而解了。
在.NET5.0中,包括以后的版本,能用异步的地方都用异步。对不不支持的用Wait(无返回值)、Result(有返回值),这种情况会有死锁风险。
二、异步编程之async、await
异步编程,不等于提高单个执行速度,但可以让系统承受更大的并发量。.net framework 4.5之后async、await这两个关键字可以简化异步编程。
异步方法:用async关键字修饰的方法
异步方法的返回值一般都是Task<T>,T是真正的返回类型。异步方法的名称一般以Anync结尾。
无返回类型推荐使用Task,不推荐使用void,本质上无法捕获从 async void 方法引发的异常。无法使用 Catch 捕获来自 Async Void 方法的异常
异步方法的传染性,子方法中如果有await调用,那么调用者必须使用async关键字
static async Task<int> DownLoadHtmlAsync(string url, string fileName)
{
using (HttpClient httpClient = new HttpClient())
{
string html=await httpClient.GetStringAsync(url);
//这里加上await可以等待任务返回,不加await如果耗时长的操作,会报错。
await File.WriteAllTextAsync(fileName, html);
return html.Length;
}
}
使用 async void 返回的场景, 用于支持异步事件处理程序。
//这里写成async Task 会报错
private async void button2_Click(object sender, EventArgs e)
{
string s=await File.ReadAllTextAsync(@"F:\.NetCore\path\1.txt");
MessageBox.Show(s.Substring(0, 20));
}
总结:Async的方法会被编译器编译成一个类,并继承IAsyncStateMachine。接口IAsyncStateMachine只能由编译器使用,并用于为异步方法生成状态机。会主要根据await调用进行切分为多个状态,对async调用会被拆分为对MoveNext的调用。用await看似是等待,经过编译后其实没有wait。
static async Task Main(string[] args)
{
//Console.WriteLine("Hello World!");
//int length= await new Program().GetUrlContentLengthAsync();
//Console.WriteLine("Length_" + length.ToString());
//Console.ReadLine();
HttpClient httpClient = new HttpClient();
string htmlBody=await httpClient.GetStringAsync("https://www.baidu.com");
Console.WriteLine(htmlBody);
string strTxt = "Hello ZhangBin";
string path = @"E:\project\Study\.NET5.0\A\1.txt";
//if (File.Exists(path) == false)
// &n