C# 异步模块在另一个操作挂起时完成

C# 异步模块在另一个操作挂起时完成,c#,angularjs,asp.net-web-api,async-await,C#,Angularjs,Asp.net Web Api,Async Await,我正在连接Quickbooks api,下载员工信息并将其保存到本地数据库。我正在使用angularjs、webapi来实现这一点。当我将信息保存到数据库时,出现以下错误。我确实看到所有函数都有async和Wait。有人能帮我解释一下为什么我会犯这个错误吗 错误: “/”应用程序中出现服务器错误。异步模块或处理程序已完成,而异步操作仍处于挂起状态 以下粘贴的代码中出现问题: var candidate = await CandidateLoginBL.AddCandidateByEmploye

我正在连接Quickbooks api,下载员工信息并将其保存到本地数据库。我正在使用angularjs、webapi来实现这一点。当我将信息保存到数据库时,出现以下错误。我确实看到所有函数都有async和Wait。有人能帮我解释一下为什么我会犯这个错误吗

错误:

“/”应用程序中出现服务器错误。异步模块或处理程序已完成,而异步操作仍处于挂起状态

以下粘贴的代码中出现问题:

 var candidate = await CandidateLoginBL.AddCandidateByEmployeeAsync(new CandidateLoginBO()
                        {
                            FirstName = e.GivenName,
                            MiddleName = e.MiddleName,
                            LastName = e.FamilyName
          });
                        }
                    });
全流程如下:

js:

API控制器:

[HttpGet]
        [Route("syncQuickbooks")]
        public async Task<IHttpActionResult> syncQuickbooks(int IdCompany)
        {
          var result = await QuickbooksBL.FullQuickbooksSync(IdCompany);
          return Ok(result);
        }
快速书架:

     public static async Task<List<IncompleteEmp>> FullQuickbooksSync(int IdCompany)
            {return await SyncronizeEmps(IdCompany); }

        public static async Task<List<IncompleteEmp>> SyncronizeEmps(int companyId)
            {                   
                   ......      
                    List<EmployeeBO> empList = new List<EmployeeBO>();
                    await AddToHumanEfits(companyId, inQBEmpsInfo);                       ....    
                }
                           return IncompleteEmps;
            }


         public static async Task AddToHumanEfits(int companyId, List<EmployeeQbOnlineBO> qbEmpsList)
            {                
                  ....
                    qbEmpsList.ForEach(async e =>
                    {  

                            // Add a record into Candidate Login. 

                      var candidate = await CandidateLoginBL.AddCandidateByEmployeeAsync(new CandidateLoginBO()
                        {
                            FirstName = e.GivenName,
                            MiddleName = e.MiddleName,
                            LastName = e.FamilyName              });
                        }
                    });    
            }
候选联系人BL:

 public static async Task<CandidateLoginBO> AddCandidateByEmployeeAsync(CandidateLoginBO model)
        {
            return await CandidateLoginDAL.AddCandidateByEmployeeAsync(model);
        }
候选人:

public static async Task<CandidateLoginBO> AddCandidateByEmployeeAsync(CandidateLoginBO model)
        {
            CandidateLoginBO candidate = new CandidateLoginBO();

                candidate = await GetByUserNameAsync(new CandidateLoginBO() { Email = model.Email });                        candidate = await AddEmployeeAsync(model);                   
            return candidate;
        }

这种错误通常是由async void引起的。我在这里看到一个:

qbEmpsList.ForEach(async e =>
{
  ...
});
您可能希望将其制作成常规的foreach:


这种错误通常是由async void引起的。我在这里看到一个:

qbEmpsList.ForEach(async e =>
{
  ...
});
您可能希望将其制作成常规的foreach:


你不能把问题缩小到一个较小的代码示例吗?当然可以。问题发生在//将记录添加到候选登录中。部分我添加代码来显示整个流程。那么为什么我们需要所有其他代码呢?将其剥离,直到您有一个仍然存在问题的最小代码段。您不能将问题缩小到一个较小的代码示例吗?当然可以。问题发生在//将记录添加到候选登录中。部分我添加代码来显示整个流程。那么为什么我们需要所有其他代码呢?将其剥离,直到有一个仍然存在问题的最小代码段为止。那么async void有问题吗?如果你有关于它的博客,请给我发邮件link@joedotnot:My引用了这个问题:一个微妙的陷阱是将异步lambda传递给采用动作参数的方法;在这种情况下,异步lambda返回void并继承异步void方法的所有问题?如果你有关于它的博客,请给我发邮件link@joedotnot:My引用了这个问题:一个微妙的陷阱是将异步lambda传递给采用动作参数的方法;在本例中,异步lambda返回void并继承异步void方法的所有问题。
foreach (var e in qbEmpsList)
{
  ...
}