バックグラウンドで実行したいプロセスがあります。これはアクションリンクのクリックで実行されます。
呼び出すアクション:
public async Task<ActionResult> ProcessRec()
{
await Task.Run(() => waitTimer());
return RedirectToAction("Index", "Home");
}
public void waitTimer()
{
Thread.Sleep(10000);
}
しかしながら、これは私を "Index、Home"アクションにリダイレクトする前に全10秒間待ちます。私はAwait / Asyncが初めてなので、ここで何か問題があると解釈しています。 waitTimerがバックグラウンドで実行されている間に、アプリケーションをこのアクションに戻すにはどうすればよいですか。ありがとうございます。
await
あなたが知ったように、それが行われる前にユーザーに戻ることから応答をブロックします。通常は、バックグラウンドの作業を別のスレッドに置き、それを待たずに「起動して忘れる」ように設定します。ただし、ASP.NETでは、IISは使用されていないAppDomainをシャットダウンします。Task.Run
バックグラウンドスレッドが「AppDomainを使用している」ことをIISに通知しないので、バックグラウンドスレッドは「AppDomain」で終了します。Thread.Abort()
AppDomainのシャットダウン中
.NET 4.5.2以降を使用している場合は、バックグラウンドワーカーがあることをIISに通知することができます。QueueBackgroundWorkItem
。あなたはこのようにそれを使うでしょう
public ActionResult ProcessRec()
{
HostingEnvironment.QueueBackgroundWorkItem(waitTimer);
return RedirectToAction("Index", "Home");
}
public void waitTimer(CancellationToken token)
{
Thread.Sleep(10000);
}
//You also could do
public async Task waitTimer2(CancellationToken token)
{
await Task.Delay(10000);
}
これは、IISがあなたのアプリドメインをシャットダウンしないことを保証するものではありませんが、あなたが何かの最中にいることを知らせ、シャットダウンしようとするとさらに時間を要求します。デフォルトでは、すべてのキューに入っているバックグラウンド項目を完了するためにshutdownが開始されます。
詳しくはこちらこのMSDNブログそれを紹介します。
しかしながら、これは私を "Index、Home"アクションにリダイレクトする前に全10秒間待ちます。
そうです、それはawait
操作の完了を非同期的に待ちます。操作が完了するまで、スレッドはプールに戻ります。
waitTimerがバックグラウンドで実行されている間に、アプリケーションをこのアクションに戻すにはどうすればよいですか。
Task.Runは、IISに作業を登録しないという点で危険です。これは問題につながる可能性があります。代わりに、あなたが使用することができますBackgroundTaskManagerまたはハン火これはASP.NETで実行を登録します。
BackgroundTaskManager.Run(() => { waitTimer() };
return RedirectToAction("Index", "Home");
QueueBackgroundWorkItem
。 - Scott Chamberlain
応答をすぐに受け取ることができるように、メッセージをキューに送信することを考えています(Azureストレージ/サービスバスのキューなど)。
次に、メッセージをデキューして処理するための別のサービスを作成します(長時間実行されているタスクを実行します)。
これが紺碧のウェブサイト(ウェブアプリ)の場合も、あなたはウェブの仕事を使用することができます!
お役に立てば幸いです。