【发布时间】:2020-09-29 04:16:36
【问题描述】:
我的控制器调用了一个方法,我正在尝试在迭代期间添加新值
public async Task<MyResult> GetItems(int itemId) {
try
{
//returns a lists of items
var resList = await _unit.repository.GetAll(x => x.ItemId.Equals(itemId));
if(resList.Count() == 0)
throw new Exception(err.Message);
//Here i need to list the sub-items, but the method returns async
resList.ToList().ForEach(async res => {
switch (res.Type)
{
case Itemtype.None :
res.SubItems = await _unit.repository.GetAll(y => y.ItemId(res.ItemId));
break;
case Itemtype.Low :
//get from another place
break;
}
});
return new MyResult {
res = resList
};
}
catch (Exception ex)
{
throw ex;
}
}
显示了我的项目,但没有子项目
【问题讨论】:
-
事实上,您正在迭代一个临时列表(由
ToList()创建)并将子项存储在那里,而不是原始的reslist。如果将ToList().ForEach替换为直接更新resList的简单foreach循环,则可以解决此问题。 -
什么是
ForEach方法? -
@JohnWu 但
ToList没有创建新的res,它正在修改现有的。我认为切换到foreach会有所帮助,但因为代码实际上将await用于结果,而不仅仅是创建resList.Count()的任务并返回。 -
List.ForEach+ async = async void。查看 Gabriel Luci 对这个问题的回答:Async void lambda expressions
标签: c# asp.net .net asp.net-mvc async-await