背景: C# で記述された Windows Server 2008 で実行されている .NET 4.0 Web サービスがあります。コードを 1 日 1 回実行する asp.net Web サービス内でタイマーを実行したいと考えています。これに関するいくつかの制限について聞いたことがありますが (以下を参照)、ミッション クリティカルなコードではないため、いくつかの制限を回避し、コードを Web サービス内に保持するために、計画が正しいかどうかを尋ねています。ただし、クラッシュは容認できません。注:私はWCFを使用していませんし、使用できません。
計画:
- Web サービスのコンストラクターで宣言してインスタンス化
System.Threading.Timer
します (コメントアウトされた行のすぐ隣://InitializeComponent();
)。 - 30分ごとにタイマーを発射します。
- 注: 私は使用しているため
System.Threading.Timer
、以下の msdn ヒント #6 に従ってキープアライブ コードを実行する必要はありません。 - 現在の時刻がデータベースの値 (コードを実行するのに必要な時間) から 30 分以内の場合、コードを実行します。
質問:
- 上記の計画を使用してasp.net c#コードで使用することがどれほど信頼できるかを知りたいのですが
System.Threading.Timer
、それが正しく実行される場合、97%以上の時間と言えますか? - この計画は、アプリケーション プールがリサイクルされたとき、および IIS サーバーが再起動されたときに機能しますか?
以下に関して、Web サービスでタイマーを使用する際に問題があるようです。
- アプリ プールのリサイクル
- スレッドが死んでいる
- 誰も長い間ウェブにアクセスしません
- 時間メモリの問題 (Windows サービスを使用することをお勧めします)
参考文献:
Web サービスの呼び出しを 1 時間ごとにアクティブにする Web サイトのタイマー
http://forums.asp.net/t/1079158.aspx/1
http://msdn.microsoft.com/en-us/magazine/cc163854.aspx (ヒント #6 を参照)
ヒント 6 より「System.Threading 名前空間にある Timer クラスは、非常に便利ですが、少なくとも Web 開発者にとっては、.NET Framework ではあまり知られていないクラスです。タイマーが作成されると、設定可能な間隔で ThreadPool からスレッドで指定されたコールバックが呼び出されます。これは、ASP.NET アプリケーションへの着信要求なしで実行するコードを設定できることを意味します。これは、バックグラウンド処理にとって理想的な状況です。このバックグラウンド プロセスでも、インデックス作成や電子メールの送信などの作業を行うことができます。」</p>