5

バックグラウンドで実行したいプロセスがあります。これはアクションリンクのクリックで実行されます。

呼び出すアクション:

   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がバックグラウンドで実行されている間に、アプリケーションをこのアクションに戻すにはどうすればよいですか。ありがとうございます。


3 답변


4

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ブログそれを紹介します。


  • 4.5にNo HostingEnvironment.QueueBackgroundWorkItemはありません - rnofenko
  • 彼は.NET 4.5.2を言った。 - John Saunders
  • 私は4.5.2にアップデートしました、そして、上記は私の必要性のために完全に働きます!とても有難い! - Norman Bentley

2

しかしながら、これは私を "Index、Home"アクションにリダイレクトする前に全10秒間待ちます。

そうです、それはawait操作の完了を非同期的に待ちます。操作が完了するまで、スレッドはプールに戻ります。

waitTimerがバックグラウンドで実行されている間に、アプリケーションをこのアクションに戻すにはどうすればよいですか。

Task.Runは、IISに作業を登録しないという点で危険です。これは問題につながる可能性があります。代わりに、あなたが使用することができますBackgroundTaskManagerまたはハン火これはASP.NETで実行を登録します。

BackgroundTaskManager.Run(() => { waitTimer() };
return RedirectToAction("Index", "Home");


  • あなたが使用するために4.5.2にアップグレードすることができない場合、2つのリンクされたライブラリは非常に良い選択肢です。QueueBackgroundWorkItem。 - Scott Chamberlain
  • @スコットうん、私は彼が.NET 4.5を言ったのを見ました:) - Yuval Itzchakov

1

応答をすぐに受け取ることができるように、メッセージをキューに送信することを考えています(Azureストレージ/サービスバスのキューなど)。

次に、メッセージをデキューして処理するための別のサービスを作成します(長時間実行されているタスクを実行します)。

これが紺碧のウェブサイト(ウェブアプリ)の場合も、あなたはウェブの仕事を使用することができます!

お役に立てば幸いです。

リンクされた質問


関連する質問

最近の質問