私はHostingEnvironment.QueueBackgroundWorkItem
でアクションを実行していると言うthis documentation読んだ:HostingEnvironment.QueueBackgroundWorkItemは実際にリサイクルを遅延させますか?
が現在実行されているこのAPIを介して登録されたどのように多くの作業項目を追跡することができるASP.NETでの通常のThreadPool作業項目とは異なりますし、これらの作業項目の実行が完了するまで、ASP.NETランタイムはAppDomainのシャットダウンを遅延させようとします。このAPIは、ASP.NET管理のAppDomainの外部で呼び出すことはできません。提供されているCancellationTokenは、アプリケーションのシャットダウン時に通知されます。
だから私は、このサンプルコード書いた:
private void Check() {
HostingEnvironment.QueueBackgroundWorkItem(ct => CheckRecyclingBehaviour(ct));}
}
private async void CheckRecyclingBehaviour(CancellationToken ct) {
while (true) {
await Task.Delay(1000);
if (ct.IsCancellationRequested) {
AppendToFile("Recycling soon...");
await Task.Delay(1000);
AppendToFile("But we still have time to finish...");
break;
}
}
}
を私は(IIS 7上)check()
を実行したと、しばらくして私は、IISマネージャを使用してリサイクルを余儀なくされました。
最後に、私はdebug.txtファイルをチェックしました。これには、 "リサイクルすぐ..."という1行が含まれています。
CancellationTokenは通知されましたが、AppDomain Shutdownは実際には遅延されませんでした(2回目の印刷が行われていないため)。
特に、私が読んだいくつかの投稿を考えれば、かなり奇妙に思えます。recycling will be delayed by 30 seconds。
私に何か不足していますか?
実際には、それが完全に修正されるかどうかわかりませんが、間違っているかもしれませんが、強制的にリサイクルすると、「自然に起こった」ときだけ、QueueBackgroundWorkItemで実行中のタスクを尊重しないと思います。それを 'Task'に変更するとナチュラルリサイクルのために修正されますが、私はまだ強制リサイクルが同じように動作すると思います。 –
ありがとう、私は 'タスク'に変更し、それは働いた。スコット、警告のためにありがとう、しかし幸いにも強制的なリサイクルは、実行中のタスクを尊重します。 – oavraham