私は自分自身を青色に読んだことがあり、簡単な答えがあることを望んでいます。コントローラから戻って非同期メソッドが完了するのを待たずに
"野生の中の"さまざまなアプリからテレメトリを処理するウェブAPIがあります。私のコントローラの1つで、私の中央監視データベースにエラーを記録し、私は、呼び出し側がどのように重要なパフォーマンスを発揮しているのかを知る実際の方法はなく、最初のWebサービス要求を作成するためにはかなりのヒットです。
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);
// ok, I've got content, now log it but don't wait
// around to see the results of the logging, just return
// an Accepted result and begone
repository.SaveSubmission(model); // <-- fire and forget, don't wait
return Accepted();
} catch (Exception)
return InternalServerError();
}
}
それはそれは簡単であるべきが、どうやらないように思える:
基本的に、私が探しているこのようなものです。私はからすべてを示すさまざまな投稿をいくつでも読んだだけです。Task.Run()を使用してください〜これはひどい間違いで、あなたが望むものを達成することはできません!
私のシナリオでの問題は、非同期メソッドを呼び出すさまざまな方法の迷路に関係なく、このプロセスがASP.NETワーカープロセスで実行されているため、最後の2時間かそこらで様々なSOの質問とStephen Clearyのブログを読んで過ごす。
この場合の根本的な問題は、私が「発砲して忘れる」メソッドがhttpコンテキストにバインドされていて、ASP.NETワーカープロセスによって早期終了することがある場合です。
このメソッド/タスク/プロセスをそのASP.NETコンテキストから削除する方法はありますか?その要求がモデルに解析されると、私自身はhttpコンテキスト内で動作する必要はもうありません。簡単な方法があれば、私はそこから移動することができます(そして、ウェブサイト/アプリケーションプールの再起動を禁止することができます)。
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);
SomeStaticClass.SaveSubmission(model); // <-- fire and forget, don't wait
return Accepted();
} catch (Exception)
return InternalServerError();
}
}
...そして唯一の事を「クロスを持っている:デューデリジェンスの便宜上
、のは、私は、コントローラ内のリポジトリコンテキストを取り除くと言うと、他のいくつかの文脈にそれを委任してみましょうlines "はモデル自体であり、他のコードロジックの依存関係はありません。私は恐らく山腹を作っています - データベースへの挿入はとにかく時間がかかりません...それは簡単だと思われますが、私も明らかにそうです今夜は "十分に良い"のために頑固に頑張ってください。
お返事ありがとうございます。私はdbの書き込みは重要ではないことを認識していますが、当初はその意味を理解することなく「なぜ」ではないと考えました。私はこのシナリオの考えを落としました。私はこれを研究している私の旅行でHangFireに出くわしました。そして実際に必要が生じたときには、心に留めておきます。 – jleach