簡單的用法

使用 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 返回的方法