2015-09-25 25 views
6

サービスAPI呼び出しがあるとします。呼び出し先はパフォーマンス上重要なので、必要以上にAPI呼び出しを保持しないようにするには、SaveAsync()メソッドが使用されます。しかし、それは非同期バージョンと同じくらい長い(あるいは多分もっと長い)API呼び出しを保持するので、私はawaitできません。非同期メソッドを待つ必要がありますか?

は、私が求めている理由はこれです:あなたはないawait呼び出しを行う場合、返さTaskオブジェクトがガベージコレクトなる可能性はありますか?もしそうなら、それは実行中のタスクを中断するでしょうか?

+0

を経由して、コードどこのビットを表示することができますあなたはこの方法を待っていますか? –

+1

APIを保持していると確信していますか?私が知っているように、ポイントは空間ブロックに格納され、結果が来るときにCLRはコード –

答えて

6

私が求めている理由は:コールを待たずに、返されたタスクオブジェクトがガベージコレクションされる可能性はありますか?

一般的に、それは起こりません。タスクをキューに入れる基礎をなすTaskSchedulerは、完了するまで、通常、希望のライフタイムの参照を保持します。あなたはTaskScheduler.QueueTaskのドキュメントでそれを見ることができます:

典型的な実装は将来のある時点で、これらのタスクを実行しますスレッドによってサービスされるだろう内部データ構造にタスクを格納します。

実際の問題は、実行時に進行中の非同期操作を追跡するASP.NET SynchronizationContextになります。非同期操作の前にコントローラのアクションが終了すると、例外が発生します。

あなたは「火をして忘れる」がASP.NETでの操作をしたい場合は、ASP.NETランタイムに登録することを確認する必要があり、どちらかHostingEnvironment.QueueBackgroundWorkItemまたはBackgroundTaskManager

+0

のあなたの待っている部分を処理するだろう幸い私のために、これはWindowsサービスではなくasp.netでホストされています。しかし、それはasp.netでこれを行うと考えている人にとっては良い情報です。 – Alex

2

いいえ、実行中のタスクを中断することはありませんが、タスクの例外も正しく観察されません。実行中のすべてのコードをtry ... catchにラップすることで(少なくとも部分的に)回避し、例外を記録できます。

また、asp.netの中にいる場合は、アプリケーション全体を停止またはリサイクルすることができます。このの場合、タスクは中断されます。これは避けるのが難しく、AppPoolのシャットダウン通知に登録するか、Hangfireのようなものを使用することができます。

関連する問題