async和await构成的异步方法
async和await构成的异步方法
1. asyn标识的异步方法
1.1 async 方法的返回值
1.2 async与方法签名及接口
1.3 async方法是会扩散的
1.4 async和匿名委托、Lambda
1. asyn标识的异步方法
1.1 async 方法的返回值
1.2 async与方法签名及接口
1.3 async方法是会扩散的
1.4 async和匿名委托、Lambda
C# 5.0引入了async特性:
private async void DumpWebpageAsync(string uri)
{
WebClient webClient = new WebClient();
string page = await webClient.DownloadStringTaskAsync(uri);
Console.WriteLine(page);
}
Task和它的子类Task
1. asyn标识的异步方法
1.1 async 方法的返回值
async标记的方法有三种类型返回值:
- Task;
- Task
; - void。
对于没有返回值的异步情景,做好还是使用返回Task的async方法,因为返回Task的方法更容易处理诸如异常处理、任务排序等等问题。但是,在使用async来标记UI的事件处理函数时,必须返回void。
1.2 async与方法签名及接口
在函数重载、实现接口或者调用方法时,async关键字并不是函数签名的一部分。它只在函数编译时发生作用。正因为如此,在重载方法和实现接口时会完全忽略async关键字。
class BaseClass
{
public virtual async Task<string> Test()
{
...
}
}
class SubClass : BaseClass
{
public override Task<string> Test()
{
...
}
}
Interface类型不能在方法声明中使用async,因为完全可以在实现时决定方法是同步还是异步的。
1.3 async方法是会扩散的
使用一个返回Task的异步API的最好方式就是在一个async方法中await它。如果这么做了,那么你的调用者也可能await你的方法。如此一来异步会遍布基本代码,最后形成一个异步方法链。
1.4 async和匿名委托、Lambda
- async标识的匿名委托:
Func<Task<int>> getNumberAsync = async delegate{ return 3; }
- async标识的Lambda:
Func<Task<int>> getNumberAsync = async () => 3;