异步的执行

本文关键字:执行 异步 | 更新日期: 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,但您不必显式地返回一个。在编译过程中,会发生一些神奇的事情,当等待发生时,会为您返回一个任务,并将方法的其余部分封送至一个延续