async和await构成的异步方法

async和await构成的异步方法

C# 5.0引入了async特性:

  1. private async void DumpWebpageAsync(string uri)
  2. {
  3. WebClient webClient = new WebClient();
  4. string page = await webClient.DownloadStringTaskAsync(uri);
  5. Console.WriteLine(page);
  6. }

Task和它的子类Task表示异步的操作,它们能够在操作完成时执行回调。回调可以通过它们的ContinueWith方法来传入。C# 5.0引入了await关键字可以实现相同的能力。

1. asyn标识的异步方法

1.1 async 方法的返回值

async标记的方法有三种类型返回值:

  • Task;
  • Task;
  • void。
    对于没有返回值的异步情景,做好还是使用返回Task的async方法,因为返回Task的方法更容易处理诸如异常处理、任务排序等等问题。但是,在使用async来标记UI的事件处理函数时,必须返回void。

1.2 async与方法签名及接口

在函数重载、实现接口或者调用方法时,async关键字并不是函数签名的一部分。它只在函数编译时发生作用。正因为如此,在重载方法和实现接口时会完全忽略async关键字。

  1. class BaseClass
  2. {
  3. public virtual async Task<string> Test()
  4. {
  5. ...
  6. }
  7. }
  8. class SubClass : BaseClass
  9. {
  10. public override Task<string> Test()
  11. {
  12. ...
  13. }
  14. }

Interface类型不能在方法声明中使用async,因为完全可以在实现时决定方法是同步还是异步的。

1.3 async方法是会扩散的

使用一个返回Task的异步API的最好方式就是在一个async方法中await它。如果这么做了,那么你的调用者也可能await你的方法。如此一来异步会遍布基本代码,最后形成一个异步方法链。

1.4 async和匿名委托、Lambda

  • async标识的匿名委托:
  1. Func<Task<int>> getNumberAsync = async delegate{ return 3; }
  • async标识的Lambda:
  1. Func<Task<int>> getNumberAsync = async () => 3;




原文地址:https://www.cnblogs.com/qianzi067/p/5843736.html