什么是异步编程
什么是异步编程呢?举个简单的例⼦:
using System.Net.Http;
using System.Threading.Tasks;
using static System.Console;
namespace Core
{
class Async
{
static void Main()
{
Start();
End();
}
static void Wait()=>WriteLine("");
static void End()=>WriteLine("");
static int Start()
{
WriteLine("");
HttpClient client = new HttpClient();
Waiting();
var result = client.GetStringAsync("www.visualstudio/");
string str = result.Result;
return str.Length;
}
}
}
上⾯这段代码中,Main⽅法中的代码是按照⾃上⽽下的顺序执⾏的。⽹络状况不佳时,Start()⽅法是⽐较耗时(注意,这⾥在Start⽅法中调⽤了异步⽅法GetStringAsync,但该⽅法在此处是以同步⽅式执⾏的,具体原因下⽂会进⾏说明),在Start()⽅法执⾏完毕之前,整个程序处于阻塞状态。⽽异步编程可以很好的解决这个问题,⼀句简单的话来概括异步编程就是,程序⽆须按照代码顺序⾃上⽽下的执⾏。
async/await
C#5.0新增了async和await关键字,使⽤这两个关键字可以⼤⼤简化异步编程
使⽤ async 关键字可将⽅法、或标记为异步,即,⽅法中应该包含⼀个或多个await表达式,但async关键字本⾝不会创建异步操作。
public async Task Asy()
{
//
}
这⾥需要注意⼀点,若使⽤async关键字标记的⽅法中没有使⽤await关键字(编译器会给出警告但不报错),那么该⽅法将会以同步⽅式执⾏。
定义异步⽅法的⼏点要求
定义⼀个异步⽅法应满⾜以下⼏点:
使⽤async关键字来修饰⽅法
在异步⽅法中使⽤await关键字(不使⽤编译器会给出警告但不报错),否则异步⽅法会以同步⽅式执
⾏
尽量不使⽤void作为返回类型,若希望异步⽅法返回void类型,请使⽤Task
异步⽅法名称以Async结尾
异步⽅法中不能声明使⽤ref或out关键字修饰的变量
下⾯定义⼀个异步⽅法StartAsync():
static async Task<int> StartAsync()
{
HttpClient client = new HttpClient();
var str = await client.GetStringAsync("www.visualstudio/");
return str.Length;
}
异步⽅法的返回类型
Task<T>
如果在调⽤匿名⽅法时使⽤了await关键字,且匿名⽅法的返回类型是Task<T>,那么我们得到的返回类型是T。若未使⽤await关键字,则返回类型是Task。未使⽤await,调⽤GetStringAsync⽅法时result是Task类型。
从上图我们可以看到调⽤GetStringAsync⽅法时未使⽤await关键字,result是Task类型,我们可以通过GetType()⽅法来获取result的详细类型信息:
从上图可以看到result的类型全名是System.Threading.Tasks.Task
从上图我们可以看到使⽤await关键字时,result是string类型,⽽匿名⽅法GetStringAsync的返回类型是Task<string>
Task
如果在调⽤匿名⽅法时使⽤了await关键字,且匿名⽅法的返回类型是Task,那么我们得到的返回类型是void。若为使⽤await关键字,则得到的返回类型是Task。
void
不建议使⽤void作为异步⽅法的返回值。
await和async使用方法因为使⽤Task或Task<TResult>任务作为返回值,其属性携带有关其状态和历史记录的信息,如任务是否完成、异步⽅法是否导致异常或已取消以及最终结果是什么。⽽await运算符可访问这些属性。
异步⽅法执⾏流程
异步程序执⾏流程
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论