简单的用法

使用 async-await 需要三件事:

  • Task 对象:该对象由异步执行的方法返回。它允许你控制方法的执行。
  • await 关键字:等待一个 Task。将此关键字放在 Task 之前,异步等待它完成
  • async 关键字:所有使用 await 关键字的方法都必须标记为 async

一个小例子,演示了这个关键字的用法

public async Task DoStuffAsync()
{
    var result = await DownloadFromWebpageAsync(); //calls method and waits till execution finished
    var task = WriteTextAsync(@"temp.txt", result); //starts saving the string to a file, continues execution right await
    Debug.Write("this is executed parallel with WriteTextAsync!"); //executed parallel with WriteTextAsync!
    await task; //wait for WriteTextAsync to finish execution
}

private async Task<string> DownloadFromWebpageAsync()
{
    using (var client = new WebClient())
    {
        return await client.DownloadStringTaskAsync(new Uri("http://stackoverflow.com"));
    }
}

private async Task WriteTextAsync(string filePath, string text)
{
    byte[] encodedText = Encoding.Unicode.GetBytes(text);

    using (FileStream sourceStream = new FileStream(filePath, FileMode.Append))
    {
        await sourceStream.WriteAsync(encodedText, 0, encodedText.Length);
    }
} 

有些事情需要注意:

  • 你可以使用 Task<string> 或类似的异步操作指定返回值。await 关键字一直等到方法执行完毕并返回 string
  • Task 对象只包含方法执行的状态,它可以用作任何其他变量。
  • 如果抛出异常(例如 WebClient),它会在第一次使用 await 关键字时冒泡(在此示例中为 var result (...)
  • 建议命名将 Task 对象作为 MethodNameAsync 返回的方法