异步,两种等待的方法。只有一个回来

时间:2015-02-23 19:11:22

标签: c# asynchronous

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

如果你看一下这个例子:

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);
}

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

谢谢

1 个答案:

答案 0 :(得分:4)

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()都可以等待它并检查结果。它可能无法保证&#34;这两种方法都能正常工作,但它至少会暴露原因某些东西不起作用。而不是猜测。