async/await的使用:
(1)如果一个方法标注了async,则其返回值只能是 void,Task,Task<T>三者之一
(2)如果异步方法中没有await,那么这个方法将会以同步方式执行
(3)单个async方法中可以拥有多个await
(4)当遇到await表达式时,调用线程将会挂起,知道await方法完成。这里的挂起和阻塞是不同的,如以下代码,在Button_click方法中给,当第一次遇到await时,调用线程(UI线程)挂起,也就是相当于本次执行结束了,UI线程会正常显示了,UI不会被阻塞。等被调用的异步方法完成后,UI线程调度程序会重新接着执行,将返回的字符串赋值给textBox控件。这时会调用下一条 textBox.Text = await DoWorkAsync("Second string"),调用的线程会再次挂起。这时UI就能够把上一条调用textBox.Text = await DoWorkAsync("First string")时返回值First string给显示出来。
(5)await关键字将从视图中隐藏返回的Task对象,直接返回实际的返回值。
private async void Button_Click(object sender, RoutedEventArgs e)
{
textBox.Text = await DoWorkAsync("First string"); //点击按钮后,等待5s在textBox中显示字符串First string
textBox.Text = await DoWorkAsync("Second string"); //又过了5s后在textBox中显示字符串Second string
textBox.Text = await DoWorkAsync("Third string"); //又过了5s后在textBox中显示字符串Third string
}
private async Task<string> DoWorkAsync(string myString)
{
return await Task.Run(
() =>
{
Thread.Sleep(5000);
return myString;
});
}