为什么下面的代码总是产生一个"异步模块或处理程序在异步操作仍然未决时完成"?
当我使用' Dim OriginalUser As ApplicationUser = db.Users.Where(Function(p)p.Id = id).ToList(0)'它工作正常。
在继承自IdentityDbContext的ApplicationDBContext上禁用了延迟加载。为什么SaveChanges-Part不再提供上下文?我错过了什么?
Public Async Sub PatchUser(id As String, <FromBody> ChangedUserAttributes As Delta(Of ApplicationUser))
Using ctx As New ApplicationDbContext
Validate(ChangedUserAttributes.GetEntity())
If Not ModelState.IsValid Then
Throw New HttpResponseException(New HttpResponseMessage(HttpStatusCode.BadRequest))
End If
Dim OriginalUser As ApplicationUser = Await ctx.Users.SingleOrDefaultAsync(Function(p) p.Id = id)
If OriginalUser Is Nothing Then
Throw New HttpResponseException(HttpStatusCode.NotFound)
End If
Try
ChangedUserAttributes.TrySetPropertyValue("Email", "Emil")
ChangedUserAttributes.Patch(OriginalUser)
Await ctx.SaveChangesAsync
Return
Catch ex As Exception
Throw New HttpResponseException(New HttpResponseMessage(HttpStatusCode.BadRequest))
End Try
End Using
End Sub
答案 0 :(得分:3)
这是因为Async Sub
。这个方法应该是一个返回Task
的异步函数,并且(如果你自己调用它)它需要用Await
调用。
您可以在async
on ASP.NET helpful上找到我的文章:
当异步处理程序完成请求,但ASP.NET检测到尚未完成的异步工作时,会收到InvalidOperationException,并显示消息“异步操作仍处于挂起状态时异步模块或处理程序已完成。”这是通常是由于异步代码调用异步void方法
以及关于async
best practices的文章:
避免异步void ...返回void的异步方法不能提供一种简单的方法来通知调用代码它们已经完成。很容易启动几个异步void方法,但要确定它们何时完成并不容易。