异步的,两个可等待的方法。只有一个 returns

Asyncronous, two awaitable methods. Only one returns

我在异步编程方面遇到了一些问题。

如果你看这个例子:

public async void SaveUsersThings(List<User> Users )
{                      
    await SaveUsersCars(Users);
    await SaveUsersHouses(Users);          
}

所以我希望SaveUsersThings执行以下两种方法:

public async Task SaveUsersCars(List<User> Users)
{
    var listofCars = new List<Car>();
    foreach (var item in Users)
    {
        var cars = await _sqlrepo.GetAllCars(item.UserId);
        foreach (var car in cars)
        {
            listofCars.Add(car);
        }
    }

    _sqlrepo.SaveListOfCars(listofCars);
}

然后这个(除obj外与上面相同)

public async Task SaveUsersHouses(List<User> Users)
{
    var listofHouses = new List<House>();
    foreach (var item in Users)
    {
        var houses = await _sqlrepo.GetAllHouses(item.UserId);
        foreach (var house in houses)
        {
            listofHouses.Add(house);
        }
    }
    _sqlrepo.SaveListOfHouses(listofHouses);
}

问题是只有第一个方法完成了它应该做的事情(将一些东西保存到数据库)。我想这与我没有完全理解这种编程有关。有人可以解释一下我如何获得两种方法 "work" 吗?

谢谢

public async void SaveUsersThings(List<User> Users )

如何知道是否有错误? async void 有效地忽略任何错误。 (我怀疑 C# 团队真的根本不想支持 async void,但需要向后兼容一些现有的范例。关于事件处理程序的一些事情,我不知道。)基本上 void 阻止任何使用代码实际等待结果或检查该结果。所以很可能有一个 AggregateException 根本无处可去。

async 应该是 "async all the way down"。使顶级方法可等待:

public async Task SaveUsersThings(List<User> Users )

这样调用 SaveUsersThings() 的任何东西都可以等待它并检查结果。它可能无法保证 "both methods will work",但它至少可以揭示某些东西不起作用的 原因。而不是猜测。