私は同様の問題を抱えていました.ASPの概念実証を開発しており、数時間かかる可能性のあるタスクを実行するバックグラウンドスレッドを使用しています. 問題は、ASP.Net がいつでも AppDomain をリサイクルできることです (バックグラウンド スレッドを強制終了します)。
これを防ぐには、バックグラウンド スレッドを ASP.Net に登録して、スレッドをシャットダウンするように通知します。これを行うには、次のインターフェイスを実装します。
public interface IRegisteredObject
{
void Stop(bool immediate);
}
次の静的メソッドを使用して、オブジェクトを ASP に登録します。
HostingEnvironment.RegisterObject(this);
ASP.NET が AppDomain を破棄すると、最初にすべての登録済みオブジェクトで Stop メソッドの呼び出しが試行されます。ほとんどの場合、このメソッドは 2 回呼び出され、1 回は immediate が false に設定されます。これにより、コードが行っていることを完了するための少しの時間が与えられます。ASP.NET では、IRegisteredObject のすべてのインスタンスが作業を完了するために、それぞれ 30 秒ではなく、合計 30 秒かかります。その期間の後、登録済みのオブジェクトが残っている場合は、immediate を true に設定して再度呼び出します。
Stop メソッドが戻らないようにする (ワーカーがビジー状態のときにフィールドをロックする) ことで、作業が完了するまで ASP が AppDomain をシャットダウンしないようにします。
public void Stop(bool immediate)
{
lock (_lock)
{
_shuttingDown = true;
}
HostingEnvironment.UnregisterObject(this);
}
public void DoWork(Action work)
{
lock (_lock)
{
if (_shuttingDown)
{
return;
}
work();
}
}
キャンセル オプションを利用するには、アクションの代わりにタスクを使用します。特定のケースでは、このようなタスクを実行するタイマーを開始できます。
PS。これはハックであり、ASP はバックグラウンド タスクを実行するためのものではないため、可能な場合は Windows サービスまたは WCF サービスを使用してください。開発、メンテナンス、インストールが簡単になるので、私はこれを使用しています。
詳細については、私のソースを参照してください: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx