2017-08-22 4 views
0

でタスクスケジューラで、いくつかの方法を制御するためにSendmail(),Downloadfile(),ProcessFile(),ExportFIle()のような4つのメソッドを持っている以下のように私は、コンソールアプリケーションを持って、私は毎日の朝8を実行するタスクスケジューラとしてこれを作った:AMは12のようないくつかの時間を.But Oクロック私はfunctions.Butのみ残り2を実行できるように当時)Sendmail()とDownloadfileを(コメントます私は、私はVisual Studioでアプリケーションを開きますされて行うために使用したもの。だからのみProcessFile()ExportFIle()を実行したいです問題は、私がコードのコメントを忘れた場合、翌朝8時のスケジューラーは2つの関数でのみ実行されます。コードにコメントを付けずにこの状況を管理できる方法はありますか?どのように.NET

namespace Testconsole 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Sendmail(); 
      Downloadfile(); 
      ProcessFile(); 
      ExportFIle(); 
     } 
    } 
} 
+3

あなたは 'TaskScheduler'から、あなたのプログラムにコマンドラインパラメータを渡すことができます。たとえば、12時に実行する人に、 '--download_only'パラメータでプログラムを起動する新しい' TaskScheduler'を作成してみましょう。あなたのプログラムの中でそれを読んで適切に扱う必要があるのです。 – Tigran

+0

サードパーティのDLLがほしいと思わない場合** – ironstone13

答えて

1

は、構成XMLファイルを作成します。コンソールアプリケーションはファイルを読み込んで実行するメソッドを決定し、コード自体を変更することなく変更が必要なときはいつでもXMLを変更できます。

また、4つの異なるコンソールアプリケーションにアプリケーションを分割して、個別に実行することができます。彼ら自身の予定された仕事で。 Windowsのタスクスケジューラを使用します。

また、あなたは、実行する方法を示し、次にスケジュールされたタスクでそれらを含め、すでに実行されているでしょうパラメータを受け入れるようにmainメソッドを変更することができます。

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (args.Length == 0) 
     { 
      Sendmail(); 
      Downloadfile(); 
      ProcessFile(); 
      ExportFile(); 
     } 

     foreach (string s in args) 
     { 
      switch (s) 
      { 
       case "SendMail": 
        Sendmail(); 
        break; 
       //etc. 
      } 
     } 
    } 
} 
+0

しかし、すべての関数は関連しています。そして朝、これらはすべて順番に実行しなければなりません。その後は任意の順序で実行できます。 – peter

+0

したがって、 、およびパラメータではありません。 パラメータなし=すべてを実行します。 パラメータ文字列 "SendMail"が "メール送信"を実行しました@Peter –

+0

の例を含むように回答を編集しました。これをチェックしますか? – peter

1

最も簡単な解決策は、サードパーティのDLLがこれを管理したくない場合はCronNet

UPDATEのようなスケジューリングフレームワークを利用するだろう - あなたのコンソールにいくつかのコマンドライン引数を導入する可能性アプリ:引数が渡されていない場合、デフォルトで

  • 、 - それだけでトンを実行します - 特定のタスク名を指定した場合、すべてのタスクが
  • を実行しています
  • を尋ねるあなたの方法に文字列のコマンドライン引数からいくつかの単純なマッピングの紹介 - 例えば規則ベースのマッピング

- シンプルDictionary<string,Action>または単にいくつかの反射のいずれか:あなたはあなたの各タスクをスケジュールすることができ myScheduler.exe ProcessFile ExportFile

を独立したとしてCronJob

あなたのコードは、この(これはCronNetのwikiに基づいています)

01のようになります
using System.Threading; 
using CronNET; 

namespace CronNETExample.Console 
{ 
    class Program 
    { 
     private static readonly CronDaemon cron_daemon = new CronDaemon();    

     static void Main(string[] args) 
     { 
      cron_daemon.add_job(new CronJob("* * * * *", Sendmail)); 
      cron_daemon.add_job(new CronJob("* * * * *", Downloadfile)); 
      cron_daemon.add_job(new CronJob("* * * * *", ProcessFile)); 
      cron_daemon.add_job(new CronJob("* * * * *", ExportFIle)); 

      cron_daemon.start(); 

      // Wait and sleep forever. Let the cron daemon run. 
      while(true) Thread.Sleep(6000); 
     } 
    } 
} 
+0

サードパーティ製のDLLを使用したくありません – peter

+0

@peter、回答を更新しました – ironstone13

1

両方のバージョンのコードをコンパイルしてVSを忘れることができます。とにかく

すべてQuartz.Netようクロンスケジューラを使用して、Windowsのサービスとしてあなたのプログラムを使用することになるコメントやコンパイルせずにこれを行うための、よりエレガントな方法。

+0

サードパーティのDLLが不要です – peter

+0

答えの最初の部分、プログラムの2つのコンパイルされたバージョン – r1verside

1

簡単な方法は、2つの別々のスケジュール機能にあなたの「アクチュエータ」の機能をラップしている:

namespace Testconsole 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args[0] = "8") 
      ScheduleFor8(); 
      if (args[0] = "12") 
      ScheduleFor12(); 

     } 
     static void ScheduleFor8() { 
      Sendmail(); 
      Downloadfile(); 
      ProcessFile(); 
      ExportFIle(); 
     } 
     static void ScheduleFor12() { 
      ProcessFile(); 
      ExportFIle(); 
     } 
    } 
} 
関連する問題