web-dev-qa-db-ja.com

Asp.NetのTask.RunとQueueBackgroundWorkItemの違い

違いは何ですか

Task.Run(() => { 
     LongRunningMethod();
});

または

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod());

Task.RunまたはQBWIを使用して呼び出される非同期タスク内で、約10分間テキストファイルに行を書き続けるAsp.Net MVCアプリケーションでテストしました。

TaskとQBWIの両方を使用しても問題ありません。私の非同期メソッドは10分まで問題なくそのファイルに書き込みを続けます。 IISからの妨害はありません。そのリサイクルに関して観察しました。

それでは、QueueBackgroundWorkItemの何が特別なのでしょうか?

39
Faisal Mq

ドキュメント には優れた説明があります。

ASP.NETは、このAPIを介して登録されている作業項目の数を現在実行していることを追跡でき、ASP.NETランタイムはこれらの作業までAppDomainのシャットダウンを遅延させようとする点で、通常のThreadPool作業項目とは異なります項目の実行が終了しました。このAPIは、ASP.NETが管理するAppDomainの外部では呼び出せません。提供されたCancellationTokenは、アプリケーションのシャットダウン時に通知されます。

Task.Factory.StartNewは、ASP.NETランタイムに作業をまったく登録しません。コードを10分間実行していますが、違いはありません。 IISリサイクルは特定の時間に発生します IISでプリセット 。何が起こっているのかを本当にテストしたい場合は、 強制的にリサイクル

35
Yuval Itzchakov

以下の記事では、あなたがやっていることに似た何かを説明し、最後のセクション「もう少し考えてみてください...」に進むと、2つの違いが強調表示されます

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

基本的に、queuebackgroundworkitemタスクの使用はASP.Netランタイムに登録されており、プロセスが閉じられたりクラッシュした場合、ASP.NETランタイムはプロセスを完了するための猶予期間を与えます。また、プロセスに通知を送信して終了することも含まれますファイナライズタスクを実行しますが、Task.Runを使用する場合、これらすべては利用できません。

9
Jags

AppDomainのシャットダウンは90秒だけ遅延できます(実際には、HttpRuntimeSection.ShutdownTimeoutおよびprocessModel shutdownTimeLimitの最小値です)。 90秒間で完了できないほど多くのアイテムがキューに入れられている場合、ASP.NETランタイムは作業アイテムの終了を待たずにAppDomainをアンロードします。

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

3