异步的执行
本文关键字:执行 异步 | 更新日期: 2023-09-27 18:00:52
InsertEmployee
中的最后一条语句是FetchEmployeesAsync
。但FetchEmployeesAsync
有一个await
。据我说,如果等待的任务没有完成,控制权就会转移回调用者。但执行仍将在InsertEmployee
结束时等待,而不会转到其调用方。我说得对吗?
public void InsertEmployee(Employee e)
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection("Employee.sqlite");
conn.InsertAsync(e);
FetchEmployeesAsync();
}
public async void FetchEmployeesAsync()
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection("Employee.sqlite");
employees = await conn.Table<Employee>().ToListAsync();
DisplayList();
}
因为FetchEmployeesAsync
正在等待conn.Table<Employee>
调用,所以它将在任务完成时将控制权返回给调用方。由于此场景中的调用者是InsertEmployee
,它调用FetchEmployees
而不等待,因此InsertEmployee
方法将立即结束并退出。
当任务在堆栈中进一步等待时,控制将一直返回到聚合根,除非它在到达聚合根(通常(但不总是(UI(的途中的某个点等待。
如果要阻止InsertEmployee
方法在FetchEmployees
完成之前完成,可以使FetchEmployees
返回Task。
public async void InsertEmployee(Employee e)
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection("Employee.sqlite");
conn.InsertAsync(e);
await FetchEmployees();
}
public async Task FetchEmployeesAsync()
{
SQLiteAsyncConnection conn = new SQLiteAsyncConnection("Employee.sqlite");
employees = await conn.Table<Employee>().ToListAsync();
DisplayList();
}
虽然FetchEmployeesAsync
的返回值是Task
,但您不必显式地返回一个。在编译过程中,会发生一些神奇的事情,当等待发生时,会为您返回一个任务,并将方法的其余部分封送至一个延续