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