31

ここに私の問題があります: ApiController 内で複数のサードパーティ メソッドを呼び出す必要があります。これらのメソッドのシグネチャはTask DoSomethingAsync(SomeClass someData, SomeOtherClass moreData). ApiController がデータをクライアントに送り返した後、これらの呼び出しをバックグラウンドで実行し続けたいと考えています。完了したらDoSomethingAsync、ログを記録して、データをファイル システムに保存したいと考えています。どうやってやるの?asyny/await 構文を使用したいと思います。

4

5 に答える 5

37

.NET 4.5.2 には QueueBackgroundWorkItem API という新しいソリューションがあります。使い方はとても簡単です:

HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c));

詳しく解説している記事はこちらです。

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

そして、このスレッドで言及されていない他のいくつかのアプローチについて言及している別の記事があります。 http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

于 2014-10-08T19:29:54.713 に答える
26

これをやりたいと思うことはほとんどありません。ほとんどの場合、それは大きな間違いです。

ASP.NET (および他のほとんどのサーバー) は、すべての要求が完了したら、サービスを破棄しても安全であるという前提で動作します。したがって、ロギングが行われる保証や、データがディスクに書き込まれる保証はありません。特にディスク書き込みの場合、書き込みが破損する可能性は十分にあります。

とはいえ、この非常に危険な設計を実装したいと確信している場合は、私のブログの を使用できます。BackgroundTaskManager

更新: request-extrinsic codeの適切なソリューションについて詳しく説明するブログ シリーズを書きました。要約すると、本当にやりたいことは、要求の外部コードを ASP.NET から移動することです。永続的なキューと独立したプロセッサを導入します。ASP.NET コントローラー アクションが要求をキューに配置し、独立したプロセッサが要求を読み取って実行します。この "プロセッサ" は、Azure 関数/Web ジョブ、Win32 サービスなどにすることができます。

于 2013-07-10T19:40:08.233 に答える
16

Stephen は、ApiController 内で本質的に長時間実行されるファイア アンド フォーゲット タスクを開始することがなぜ悪い考えなのかを説明しました。

おそらく、これらのファイア アンド フォーゲット タスクを実行するために別のサービスを作成する必要があります。そのサービスは、別の ApiController、キューの背後にあるワーカー、独自にホストでき、独立した有効期間を持つあらゆるものである可能性があります。

これにより、さまざまなタスクの有効期間の管理がはるかに簡単になり、長時間実行されるタスクの懸念が ApiController の主要な責任から切り離されます。

于 2013-07-11T13:05:17.680 に答える