Wwweixiao 2020-01-02 10:35 采纳率: 11.1%
浏览 737

.net core webapi异步接口调用数据库for里面使用await不等待,返回空(有时候有返回值)

使用异步调用一个树结构

 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)

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-17 09:44
    关注

    参考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来等待异步任务完成,而不是直接调用方法。这样可以确保线程不被阻塞,从而得到正确的返回结果。

    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型