【问题标题】:Asynchronous module completed while another operation is pending异步模块完成,而另一个操作挂起
【发布时间】:2016-09-07 17:35:38
【问题描述】:

我正在连接到 Quickbooks api,下载员工信息并将其保存到我的本地数据库。我正在使用 angularjs、webapi 来完成此操作。将信息保存到数据库时出现以下错误。我确实看到所有功能都有异步和等待。有人可以帮助我为什么会收到此错误。

错误:

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

问题出现在下面粘贴的一段代码中:

 var candidate = await CandidateLoginBL.AddCandidateByEmployeeAsync(new CandidateLoginBO()
                        {
                            FirstName = e.GivenName,
                            MiddleName = e.MiddleName,
                            LastName = e.FamilyName
          });
                        }
                    });

完整流程如下:

js:

QuickbookModule.factory('QuickbookService', ['$http', function ($http) {

    return {
 getQuickbooksSync: function () {
            return $http({
                url: '/api/QuickbookService/syncQuickbooks',
                method: 'GET',
                params: { IdCompany: sessionStorage.CID }
            });
        }

API 控制器:

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

QuickbooksBL:

     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              });
                        }
                    });    
            }

CandidateContactBL:

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

CandidateContactDAL:

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;
        }

【问题讨论】:

  • 您不能将问题缩小到更小的代码示例吗?
  • 当然。问题发生在 // 将记录添加到候选人登录中。部分。我添加代码以显示完整流程。
  • 那么为什么我们需要所有其他代码呢?剥离它,直到你有一个仍然存在问题的最小代码 sn-p。

标签: c# angularjs asp.net-web-api async-await


【解决方案1】:

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

qbEmpsList.ForEach(async e =>
{
  ...
});

你可能想把它变成一个普通的foreach

foreach (var e in qbEmpsList)
{
  ...
}

【讨论】:

  • 所以 async void 有问题吗?如果你有关于它的博客,请把链接发给我
  • @joedotnot:我的article that introduced the phrase "avoid async void" 引用了这个问题:“一个微妙的陷阱是将异步 lambda 传递给采用 Action 参数的方法;在这种情况下,异步 lambda 返回 void 并继承所有问题的异步 void 方法。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多