使用异步调用一个树结构
public async Task<List<SelectDto>> SelectDeps(int? id)
{
var results = new List<SelectDto>();
// var deps = db.Department.Where(o=>o.IsDel!=true).Where(o => o.Pid == id || (id == null && o.Pid == 0)).Include(x => x.Children).AsAsyncEnumerable();
// await foreach (var x in deps)
// {
// var dto = new SelectDto()
// {
// title = x.DepName,
// label = x.DepName,
// key = x.Id,
// children = await SelectDeps(x.Id)
// };
// results.Add(dto);
// };
var deps =await db.Department.Where(o=>o.IsDel!=true).Where(o => o.Pid == id || (id == null && o.Pid == 0)).Include(x => x.Children).ToListAsync();
for (int i = 0; i < deps.Count; i++){
var dto = new SelectDto()
{
title = deps[i].DepName,
label = deps[i].DepName,
key = deps[i].Id,
children = await SelectDeps( deps[i].Id)
};
results.Add(dto);
};
return results;
}
原来无论使用await foreach 或者 for 都会等待执行然后返回数据
直接调用接口没问题。浏览器get方法。
但是前端调用进入调试总是后台返回空值(使用angular)
参考GPT和自己的思路:
根据你提供的代码,推测可能是因为在递归调用SelectDeps方法时,线程被阻塞而导致返回空值或者部分返回值。这种情况一般是因为在异步任务中使用了同步方法或者在异步任务中阻塞了线程。
建议你尝试使用async/await来改写递归方法,确保递归调用时使用了异步方法,而不是同步方法。同时,也要确保异步任务中不阻塞线程。
例如,你可以使用以下代码来改写递归方法:
public async Task<List<SelectDto>> SelectDeps(int? id)
{
var results = new List<SelectDto>();
var deps = await db.Department.Where(o => o.IsDel != true).Where(o => o.Pid == id || (id == null && o.Pid == 0)).Include(x => x.Children).ToListAsync();
foreach (var dep in deps)
{
var dto = new SelectDto()
{
title = dep.DepName,
label = dep.DepName,
key = dep.Id,
children = await SelectDeps(dep.Id)
};
results.Add(dto);
};
return results;
}
注意,在递归调用SelectDeps方法时,要使用await来等待异步任务完成,而不是直接调用方法。这样可以确保线程不被阻塞,从而得到正确的返回结果。