236

今日、ASP.NET Web サイトのスケジュールされたタスクを実行するためのコンソール アプリケーションを作成しました。しかし、このアプローチは少しエラーが発生しやすく、保守が難しいと思います。スケジュールされたタスクをどのように実行しますか (windows/IIS/ASP.NET 環境で)

アップデート:

タスクの例:

  • データベースのメールキューからメールを送信する
  • 古いオブジェクトをデータベースから削除する
  • Google AdWords から統計を取得し、データベースにテーブルを入力します。
4

16 に答える 16

129

Stackoverflow の Jeff Atwood によるこの手法は、私が遭遇した最も単純な方法です。これは、ASP.NET のキャッシュ システムに組み込まれている "キャッシュ アイテムの削除" コールバック メカニズムに依存しています。

更新: Stackoverflow はこの方法を使い果たしました。Web サイトの実行中にのみ機能しますが、多くの人にとって役立つ非常に単純な手法です。

また、 Quartz.NETもチェックしてください

于 2009-02-12T19:13:16.337 に答える
76

Web サイトのすべてのタスク (スケジュールする必要がある) は、Web サイト内に保持され、特別なページから呼び出されます。次に、このページを頻繁に呼び出す単純な Windows サービスを作成しました。ページが実行されると、値が返されます。やるべきことがもっとあることがわかっている場合は、すぐにページを再度実行します。そうでない場合は、しばらくしてから実行します。これは私にとって非常にうまく機能し、Web コードですべてのタスク ロジックを保持しています。簡単な Windows サービスを作成する前に、Windows スケジューラを使用して x 分ごとにページを呼び出しました。

これを実行するもう 1 つの便利な方法は、Pingdomなどの監視サービスを使用することです。サービス コードを実行するページに http チェックを向けます。ページに結果が返されるようにします。これを使用して、何かが正しくない場合に Pingdom をトリガーして警告メッセージを送信できます。

于 2009-02-12T19:16:51.693 に答える
32

カスタム Windows サービスを作成します。

スケジュールされたコンソール アプリとしていくつかのミッション クリティカルなタスクをセットアップしましたが、それらを維持するのが難しいことがわかりました。DB のスケジュールを数分ごとにチェックする「ハートビート」を備えた Windows サービスを作成しました。それは本当にうまくいきました。

そうは言っても、重要ではないメンテナンス タスクのほとんどには、今でも定期的なコンソール アプリを使用しています。壊れていない場合は、修正しないでください。

于 2009-02-12T20:01:23.053 に答える
17

これは、関係者全員にとって簡単であることがわかりました。

  • DoSuchAndSuchProcess などの Web サービス メソッドを作成する
  • この Web メソッドを呼び出すコンソール アプリを作成します。
  • タスク スケジューラでコンソール アプリをスケジュールします。

この方法論を使用すると、すべてのビジネス ロジックが Web アプリに含まれますが、Windows タスク マネージャーまたはその他の商用タスク マネージャーの信頼性があり、それを開始して実行レポートなどの戻り情報を記録できます。ページに投稿する代わりに Web サービスを使用すると、Web サービスから返されるデータを簡単に取得できるため、多少の利点があります。

于 2009-02-13T02:33:51.910 に答える
10

車輪を再発明する理由は、Threading と Timer クラスを使用することです。

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }
于 2011-10-22T13:33:36.077 に答える
9

Windows スケジューラを使用して Web ページを実行します。

悪意のあるユーザーや検索エンジンのスパイダーによる実行を防ぐには、スケジュールされたタスクをセットアップするときに、次のようにクエリ文字列を使用して Web ページを呼び出すだけです: mypage.aspx?from=scheduledtask

次に、ページの読み込みで、単純に条件を使用します: if (Request.Querystring["from"] == "scheduledtask") { //executetask }

これにより、検索エンジンのスパイダーや悪意のあるユーザーがスケジュールされたタスクを実行できなくなります。

于 2012-03-29T16:32:01.873 に答える
4

このライブラリは魅力的な http://www.codeproject.com/KB/cs/tsnewlib.aspxのように機能します

これにより、Windows のスケジュールされたタスクを .NET コードから直接管理できます。

于 2010-02-04T17:30:10.147 に答える
3

さらに、アプリケーションでSQL SERVERを使用している場合は、SQLAgentを使用してタスクをスケジュールできます。これは、データ駆動型の繰り返し発生するコード(電子メールのリマインダー、定期メンテナンス、パージなど)を一般的に配置する場所です。SQL Agentに組み込まれている優れた機能は、重要なタスクが失敗した場合にアラートを出すことができる失敗通知オプションです。

于 2009-02-13T17:13:49.500 に答える
2

私はASP.NETプロジェクトでAbidarをうまく使用しました(ここにいくつかの背景情報があります)。

この方法の唯一の問題は、ASP.NET Web アプリケーションがメモリからアンロードされた場合 (つまり、使用率が低いため)、タスクが実行されないことです。私が試したことの 1 つは、Web アプリケーションを 5 分ごとに実行して維持するタスクを作成することでしたが、これは確実に機能しないようだったので、代わりに Windows スケジューラと基本的なコンソール アプリケーションを使用しています。

理想的な解決策は Windows サービスを作成することですが、これは不可能かもしれません (つまり、共有ホスティング環境を使用している場合)。また、メンテナンスの観点から物事を Web アプリケーション内に保持することが少し簡単になります。

于 2009-02-12T19:43:05.030 に答える
2

サーバーを所有している場合は、Windows タスク スケジューラを使用する必要があります。AT /? を使用します。コマンドラインからオプションを表示します。

そうしないと、Web ベースの環境から、一定の間隔で特定のページにリクエストを行うように別のマシンをセットアップするなど、厄介なことをしなければならない場合があります。

于 2009-02-12T19:13:56.803 に答える
2

スケジュールされたタスクの種類がわかりません。「毎時間、foo.xml を更新する」タイプのタスクのようなものを意味する場合は、Windows のスケジュールされたタスク システムを使用します。(「at」コマンド、またはコントローラー経由。) コンソール アプリを実行するか、プロセスを開始する特別なページを要求します。

編集:追加する必要があります。これは、IIS アプリをスケジュールされた時点でも実行するための適切な方法です。したがって、DB を 30 分ごとにチェックし、一部のデータについてユーザーにリマインダーを電子メールで送信する場合、スケジュールされたタスクを使用してこのページを要求し、IIS 処理を取得できます。

ニーズがより複雑な場合は、Windows サービスを作成し、ループを実行して必要な処理を実行することを検討してください。これには、スケーリングや管理の目的でコードを分離するという利点もあります。欠点としては、Windows サービスに対処する必要があります。

于 2009-02-12T19:12:50.643 に答える
1

'ThreadPool.RegisterWaitForSingleObject'メソッドを使用して、間隔を置いてコードを実行するWindowsサービスを簡単に作成できます。それは本当に滑らかで、セットアップするのは非常に簡単です。この方法は、フレームワーク内の任意のタイマーを使用するよりも合理化されたアプローチです。

詳細については、以下のリンクをご覧ください。

Windowsサービスを使用して.NETで定期的なプロセスを実行する:http:
//allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html

于 2011-08-04T18:36:49.993 に答える
1

別の方法は次のとおりです。

1) タスクが期限切れまたは期限切れになった場合にタスクを起動する「ハートビート」Web スクリプトを作成します。

2) Webscript をヒットし、一定の間隔で強制的に実行するスケジュールされたプロセスをどこか (できれば同じ Web サーバー上) に作成します。(例: IE または whathaveyou を使用してヒートビート スクリプトを静かに起動する Windows スケジュール タスク)

タスク コードが Web スクリプト内に含まれているという事実は、純粋にコードを Web アプリケーションのコード ベースに保持するためです (両方が相互に依存していると想定されています)。これにより、Web 開発者が管理しやすくなります。 .

別の方法として、実行可能なサーバー スクリプト/プログラムを作成して、すべてのスケジュール作業自体を実行し、実行可能ファイル自体をスケジュールされたタスクとして実行する方法があります。これにより、Web アプリケーションとスケジュールされたタスクの間の根本的な分離が可能になります。したがって、Web アプリやデータベースがダウンしているかアクセスできない場合でも、スケジュールされたタスクを実行する必要がある場合は、このアプローチを使用する必要があります。

于 2009-02-12T19:18:30.707 に答える
0

1 つのオプションは、Windows サービスをセットアップし、それを取得してスケジュールされたタスクを呼び出すことです。

タイマーを使用したwinformsでは、これがASP.NETでうまく機能するとは思わない

于 2009-02-12T19:15:53.817 に答える
0

コンソール アプリケーションも使用します。Log4net などのロギング ツールを使用すると、その実行を適切に監視できます。また、適切に設計されていれば、同じコード ライブラリのいくつかを 2 つの間で共有している可能性があるため、Web ページよりも維持するのがどのように難しいかはわかりません。

これらのタスクを定期的に実行することに反対する場合は、Web サイトの管理セクションにキューとして機能する Web ページを配置できます。ユーザーがタスクの実行を要求すると、MyProcessQueue テーブルに空白の日付スタンプ レコードが挿入され、スケジュールされたタスクが X 分ごとに MyProcessQueue の新しいレコードをチェックします。そうすれば、顧客が実行したいときにのみ実行されます。

それらの提案が役立つことを願っています。

于 2009-02-12T19:13:31.110 に答える
-1

.NET用の新しいタスクスケジューラクラスライブラリ

注:このライブラリが作成されてから、MicrosoftはWindows Vista用の新しいタスクスケジューラ(タスクスケジューラ2.0)を導入しました。このライブラリは、タスクスケジューラ1.0インターフェイスのラッパーであり、Vistaでも引き続き使用でき、Windows XP、Windows Server 2003、およびWindows2000と互換性があります。

http://www.codeproject.com/KB/cs/tsnewlib.aspx

于 2010-04-25T11:42:36.387 に答える