私は同様の問題を抱えていました。私は概念のASP証明を開発しており、数時間かかるタスクを実行するバックグラウンドスレッドを使用しています。問題は、ASP.NetはAppDomainをいつでもリサイクルできることです(バックグラウンドスレッドを強制終了)。
これを防ぐには、バックグラウンドスレッドをASP.Netに登録して、スレッドをシャットダウンするように通知します。これを行うには、次のインタフェースを実装しています
public interface IRegisteredObject
{
void Stop(bool immediate);
}
をそして次の静的メソッドを使用してASPにあなたのオブジェクトを登録:ASP.NETがAppDomainのを切断すると
HostingEnvironment.RegisterObject(this);
、それは最初のピットストップをコールしようとしますメソッドを呼び出すことができます。ほとんどの場合、このメソッドは2回呼び出されます.1回は即時falseに設定されます。これは、あなたのコードが何をしているのかを完了するために少し時間を与えます。 ASP.NETでは、IRegisteredObjectのすべてのインスタンスに30秒間ではなく、作業を完了するための合計30秒が与えられます。その時間が経過した後に、登録されたオブジェクトが残っていると、直ちに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
出典
2013-06-13 12:52:31
Rob
チェックをこの1:のhttp://のstackoverflow。com/questions/1356789/quartz-net-with-asp-net –
はい、私はQuartzを知っています。私は外部のライセンス、商用またはオープンソースに依存せずにカスタムソリューションを探しています。 –
プロバイダからデータをどのように取得しますか?あなたは「URLを呼び出すための仕組みがない」と言った。彼らはあなたに電話することができない、あるいは電話することができない、あるいはその両方をすることができないと言っていますか? –