0

次のコードは、「非同期操作がまだ保留中に完了した非同期モジュールまたはハンドラ」を常に生成するのはなぜですか?非同期操作を使用する場合のEF IdentityDbContextの問題

私は「Dim OriginalUser As ApplicationUser = db.Users.Where(Function(p)p.Id = id).ToList(0)」を使用すると問題なく動作します。

IdentityDbContextから継承するApplicationDBContextでレイジーローディングが無効になります。 SaveChanges-PartでContextを使用できないのはなぜですか?私は何が欠けていますか?

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 

答えて

3

Async Subのためです。このメソッドはTaskを返す非同期関数である必要があります(自分で呼び出す場合)Awaitで呼び出す必要があります。

あなたはasync on ASP.NET helpfulに私の記事を見つけることがあります。

非同期ハンドラが要求を完了しますが、ASP.NETが完了していない非同期の仕事を検出すると、あなたがメッセージでInvalidOperationExceptionがを取得し、「非同期非同期処理がまだ保留している間に完成されたモジュールまたはハンドラ「これは非同期voidメソッド

と同様にasync best practicesに私の記事を呼び出すことにより、非同期コードに通常である:。

非同期voidを避ける... voidを返す非同期メソッドは、呼び出したコードに完了したことを通知する簡単な方法を提供しません。いくつかの非同期voidメソッドを開始するのは簡単ですが、完了した時点を判断することは容易ではありません。

+0

コントローラのように見えるので、直接呼び出されることはありませんが、Async SubではなくAsync Function ... As Taskであることは間違いありません。 – jmcilhinney

+0

ありがとうございました、それはすでに助けました。 Web APIのPATCHアクションでは、結果はMicrosoft(https://www.asp.net/web-api/overview/getting-started-with-aspnet-news)による204(No content) Web-API /アクション結果)。しかし、私がReturn New HttpResponseMessage(HttpStatusCode.NoContent)を返そうとすると、 '' System.Web.Http.IHttpActionResult 'というエラーをタイプするために' 'System.Net.Http.HttpResponseMessage'タイプのオブジェクトをキャストできません。 – user3767106

+0

@ user3767106:*何かのタスクではなく、単純な 'Task'を返すべきです。 –

関連する問題