我使用await关键字但仍然出现此错误,为什么? &GT;&GT; <异步模块或处理程序>在异步操作仍处于等待状态时完成

时间:2017-10-03 17:33:35

标签: c# asynchronous task

我决定覆盖ASP.NET身份AddToRoleAsync的{​​{1}}方法。

发件人:

UserManager

 public override Task<IdentityResult> AddToRoleAsync(long userId, string role)
 {
      return base.AddToRoleAsync(userId, role);
 }

但是在调试过程中,当程序进入 // I added async keyword public override async Task<IdentityResult> AddToRoleAsync(long userId, string role) { // Adding the await keyword here var result = await base.AddToRoleAsync(userId, role); // << It causes the error // Calling my appropriate Task method await UpdatePermissionsAsync(userId); return result; } 时,它不会继续到下一行代码,当我按下await base.AddToRoleAsync(userId, role)时,它会返回此错误:

  

System.InvalidOperationException:异步模块或处理程序   在异步操作仍未完成时完成

我很困惑,因为我在返回F5的方法之前使用了await关键字,但我仍然收到错误!

我应该如何覆盖它?

更新

通过以下@StephenCleary的提示,我在父方法的签名中找到Task,该方法调用了代码,但在调用者父方法中本身没有async void。所以上面的问题解决了现在它给我带来了新问题!因为在这种情况下,root方法是 await ,并且它不应该有OnAuthorization关键字(它会导致错误)。

  

所以我应该在async内部运行async方法    OnAuthorization 方法! 如何吗

1 个答案:

答案 0 :(得分:3)

正如我在async ASP.NET的文章中所述,此错误通常是由async void方法引起的。使用async void时,没有返回Task,因此您的代码无法await完成。

在您的特定情况下(OnAuthorization),遗憾的是,没有办法异步执行此操作。同样在我的async ASP.NET文章中,我描述了经典ASP.NET中async支持的两个限制:动作过滤器和子动作。在经典ASP.NET中无法安全地创建这两个async。 (ASP.NET Core允许async过滤器和视图组件)。在这种情况下,OnAuthorization是一个操作过滤器,因此不能是async

唯一的解决方案是升级到ASP.NET Core并使用async操作过滤器,或者使过滤器同步。我建议将所有代码同步,但也可以使用some form of sync-over-async