サービスAPI呼び出しがあるとしましょう。呼び出し先はパフォーマンスがいくらか重要であるため、API呼び出しを必要以上に長く保持しないようにするために、SaveAsync()
使用されるメソッドがあります。await
ただし、非同期バージョンと同じくらい(またはおそらくもっと長く)API呼び出しを保持するため、それはできません。
私が尋ねている理由はこれです:あなたが await
電話をしなかった場合、Task
返されたオブジェクトがガベージコレクションされる可能性はありますか?もしそうなら、それは実行中のタスクを中断しますか?
私が尋ねている理由はこれです:あなたが呼び出しを待たないならば、返されたタスクオブジェクトがガベージコレクションを得る可能性はありますか?
一般的に、いいえ、それは起こらないはずです。TaskScheduler
タスクをキューに入れる基になるものは、通常、タスクが完了するまで、必要な存続期間中、タスクへの参照を保持します。あなたはのドキュメントでそれを見ることができますTaskScheduler.QueueTask
:
典型的な実装では、タスクを内部データ構造に格納します。内部データ構造は、将来のある時点でそれらのタスクを実行するスレッドによって処理されます。
あなたの本当の問題は、実行時に進行中の非同期操作を追跡するASP.NETSynchronizationContextにあります。非同期操作の前にコントローラーのアクションが終了した場合、例外が発生します。
あなたは「火をして忘れる」がASP.NETでの操作をしたい場合は、のいずれかを介して、ASP.NETランタイムに登録することを確認しなければなりませんHostingEnvironment.QueueBackgroundWorkItem
かBackgroundTaskManager
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加