使用异步方法时,EF IdentityDbContext出现问题

时间:2016-10-01 09:39:53

标签: asp.net vb.net asp.net-web-api entity-framework-6 asp.net-identity-2

为什么下面的代码总是产生一个"异步模块或处理程序在异步操作仍然未决时完成"?

当我使用' 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

1 个答案:

答案 0 :(得分:3)

这是因为Async Sub。这个方法应该是一个返回Task的异步函数,并且(如果你自己调用它)它需要用Await调用。

您可以在async on ASP.NET helpful上找到我的文章:

  

当异步处理程序完成请求,但ASP.NET检测到尚未完成的异步工作时,会收到InvalidOperationException,并显示消息“异步操作仍处于挂起状态时异步模块或处理程序已完成。”这是通常是由于异步代码调用异步void方法

以及关于async best practices的文章:

  

避免异步void ...返回void的异步方法不能提供一种简单的方法来通知调用代码它们已经完成。很容易启动几个异步void方法,但要确定它们何时完成并不容易。