异步编程:
C#中的async和await关键字:
异步方法:用async关键字修饰的方法;
①异步方法的返回值一般是Task<T>,T是真正的返回值类型,Task<int>。惯例:异步方法名字以 Async结尾。
②即使方法没有返回值,也最好把返回值声明为非泛型的Task。
③调用泛型方法时,一般在方法前加上await关键字,这样拿到的返回值就是泛型指定的T类型;
④异步方法的“传染性”:一个方法中如果有await调用,则这个方法也必须修饰为async。
例:试一试异步
static async Task Main(string[] args)
{
string fileName = "d:/1.txt";
File.Delete(fileName);
File.WriteAllTextAsync(fileName,"hello async");//异步方法
string s = await File.ReadAddTextAsync(fileName);
Console.WriteLine(s);
}
首先写一个同步方法调用:
运行结果:
再写一个异步方法调用:
运行结果:
同样也能生成txt。
注意:
这里如果我们不写await也是可以的,因为我们写入的字符串“hello”太小了,系统写入太快,所以没什么影响。但如果我们换一个大一点的字符串,例如:我们将他换成一个可变字符串:
这里由于字符串过大,所以系统再写入的时候就会出现错误。
总结:为啥要用异步调用呢?异步不是更麻烦吗?
这里采用异步调用其实在后期我们做开发的时候,能够极大的减小我们系统的并发量。
编写异步方法:
①打印网页的HTML内容:(不带返回值的)
运行结果:
这样我们的所选网页的HTML代码就被打印出来了。
②打印网页的HTML内容:(带返回值的)
运行结果:
简单总结:如果同样的功能,既有同步方法,又有异步方法,那么首先使用异步方法。.NET 5中,很多框架中的方法也都支持异步:Main、WinForm事件处理函数。
对于不支持的异步方法怎么办?Wait() (无返回值);Result (有返回值)。风险:会产生死锁。尽量不用。