async
和 await
关键字的作用是使方法能够异步执行并等待异步操作的完成。(最重要的一点是记住 “异步执行”与“等待异步操作完成”,不是等待主线程操作完成)
async 修饰符可将 方法、lambda 表达式或匿名方法指定为异步。
-
async
关键字用于声明该方法是异步方法,允许其中使用await
操作符等待异步操作完成。 -
await
操作符用于等待异步操作的完成,并将执行控制权返回给调用方,使得线程不会被阻塞。
注意事项:
- 使用await必须在async方法中:只能在标记为async的方法中使用await关键字。在同步方法中不能直接使用await。
- 不要在UI线程中使用async和await:长时间运行的任务应该在其他线程上执行,以避免阻塞UI线程,影响用户交互。
- 理解Task的生命周期:使用async和await时,需要理解Task的生命周期和状态,包括Wait、Result和WaitAsync等方法的使用。
1. 异步方法中的await调用
问题: 在异步方法中直接调用另一个async方法时,应该使用await吗?
解答: 是的,你应该在异步方法中使用await来调用另一个async方法。这样可以确保当前方法等待被调用的异步方法完成,并且能够利用await的优化,例如不会阻塞线程。
下面是代码示例
static void Main(string[] args)
{
Console.WriteLine("Main thread is running...");
// 创建一个异步任务
var task = GetDataAsync();
// 主线程继续执行其他任务
Console.WriteLine("Main thread is doing other tasks...");
// 等待异步任务完成
task.Wait();
// 获取异步任务的结果
string data = task.Result;
Console.WriteLine("Data received: " + data);
}
public static async Task<string> GetDataAsync()
{
Console.WriteLine("GetDataAsync started...");
// 模拟耗时操作
await Task.Delay(1000);//在这里等待的时间 去执行主线程 "Main thread is doing other tasks"
Console.WriteLine("GetDataAsync completed...");
return "Data from server";
}