.net 4.5、asp.net mvc:ASP.NETアプリケーションから長期的なプロセス(1〜2分)を実行するための最良の方法は何ですか?シングルスレッド環境で実行する必要があります。つまり、プロセスは次の目的で開始されます。一度に1人のユーザーのみ、他のすべてのユーザーの実行は、現在の実行が完了するまで待機する必要がありますか?シナリオは次のとおりです。ユーザーがボタンをクリックして、ある種の長期的な計算を実行し、http応答がすぐにユーザーに返され、ユーザーは別の要求で計算のステータスを手動で要求する必要があります。Asp.net httpセッションの中止は、プロセスの終了につながるべきではなく、継続する必要があります。プロセスは、同じサーバーまたは別のサーバーで実行される場合があります。
4 に答える
http://hangfire.ioを使用してこのタスクを実行する方法を紹介します。これは、ASP.NETアプリケーション内でファイアアンドフォーゲット、遅延、および繰り返しのタスクを実行するための非常に簡単な方法です。Windowsサービスは必要ありません。
まず、NuGetを使用してパッケージをインストールします。問題がある場合は、公式ドキュメントのクイックスタートガイドを参照してください。
PM> Install-Package Hangfire
OWINスタートアップクラスを開き、次の行を追加します。
public void Configure(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
次に、長時間実行される作業を実行するメソッドを記述します(一度に1つのメソッドのみを実行するように属性を適用しました)。
[DisableConcurrentExecution]
public void LongRunning()
{
// Some processing stuff
}
次に、ファイアアンドフォーゲットとしてバックグラウンドでメソッドを呼び出し、ユーザーにすぐに応答します。
public ActionResult Perform()
{
BackgroundJob.Enqueue(() => LongRunning());
return View();
}
ジョブの完了についてユーザーに通知する場合は、SignalRの使用を検討し、LongRunning
それに応じてメソッドを追加します。
.Net 4.5.2は、タスクのスケジュールに使用できるQueueBackgroundWorkItemを追加します。サーバーを制御しない場合(サーバーが再起動された場合)、appPoolシャットダウンのデフォルトの90秒の遅延は機能しません(タスクが完了しなかったことを検出して別のサーバーで実行できない場合)。詳細については、「ASP.NETでバックグラウンドプロセスを確実にスケジュールおよび実行するためのQueueBackgroundWorkItem」を参照してください。
NServiceBusなどの製品を使用して処理をオフロードし、シングルスレッドモードで実行することをお勧めします。これの利点は、すべての要求が順番に処理され、Webサーバーで長時間実行されるプロセスが実際に発生することを望まないため、処理をWebサーバーからオフロードできることです。
サーバーを制御し、Hangfireのような完全なフレームワークよりも単純なものが必要な場合は、コンソールアプリ(.exe)を作成し、あらゆるものを作成できます...その後、Process.Startメソッドを使用して.exeを呼び出すことができます。 SQL Serverから、サービスなどに.exeを呼び出すことができます。