Task.Run()/ Task.Factory.StartNew()で時々このような問題が発生したので、その使用法について理解していない非常に基本的なものがあるに違いないと思います(中括弧が好きな人のために) 、VBをいじくり回さなければならなかったことをお詫びします):
次のコードを使用した非同期メソッドがあります。
Try
Using context As New ECOSSContext
context.Meters.Attach(entity)
Await Task.Run(Sub() _
context.SaveChanges() _
)
'ANY CODE HERE NEVER GETS FIRED
End Using
Return True
Catch ex As Exception
Return False
End Try
これは、次のような同期メソッドから呼び出されます。
Dim result = ModelService.MeterResolution.SaveMeter(data).Result
私が理解したことから、これはSaveMeter()メソッドが結果を返すまで待つ必要があります。そして、前にレイアウトしたasyncメソッドは、Task.Run行が戻るまで待機してから、続行する必要があります(したがって待機します)。代わりに、Awaitラインに到達するとすぐに、コールスタックが終了したように見えます。SaveChanges()は成功しますが、この事実をクライアントに通知できません。
別のアプリケーションでTPLを比較的頻繁に使用しており、これらの問題は発生していませんが、context.SaveChanges()のようなメソッドを使用する必要はありません。
任意の提案をいただければ幸いです。ドキュメントを読み間違えただけではないことを願っています。