我在异步编程方面遇到了一些问题。
如果你看一下这个例子:
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);
}
问题是只有第一种方法完成它应该做的事情(将一些东西保存到数据库)。我想这与我没有完全理解这种编程有关。有人可以解释我如何让这两种方法“工作”吗?
谢谢
答案 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;这两种方法都能正常工作,但它至少会暴露原因某些东西不起作用。而不是猜测。