2016-12-22 28 views
0

私は2つのメソッドを持っています。 1番目のメソッドは.exeを開始し、2番目のメソッドはその.exeによって作成された出力ファイルを検索します。一定時間X分ごとにメソッドを呼び出す方法

  1. プログラムは、.exeが呼び出された後に出力X分(app.configで定義された)を探し始める必要があります。

  2. 特定の頻度(app.configで定義されている)の後に出力ファイルを検索するメソッドを呼び出す必要があります。見つかった場合は出力ファイルを探します。偽は眠る。

  3. .exeが呼び出されてからY分(app.configで定義)までの手順2を繰り返します。超えた場合は復帰失敗を止め、次のステートメントに進みます。

私は.exeをした時刻を取得するためにdatetime.nowを使用することができます開始されますが、それにXとY分を追加し、それらの時間制限を使用する方法方法を見つけ出すことはできません。ここで

は、これまでの私のコードです:

//Running the process .exe 
DV.runprocess(); 
// check output file 
String checkOutputFrequency=System.Configuration.ConfigurationManager.AppSettings["CheckOutputFrequency"].ToString(); 
decimal outfrequencyVal = (!string.IsNullOrEmpty(checkOutputFrequency)) ? Decimal.Parse(checkOutputFrequency) : 1; 
bool FileFound = false; 

while (true) 
{ 
     FileFound = DV.checkOutputFile(); 

     if (FileFound == true) 
      break; 

     System.Threading.Thread.Sleep(Convert.ToInt32(outfrequencyVal * 60 * 1000)); 
} 
+0

XとYを秒で表します。 CurrentTimeをZ(エポックタイム)とする。 StopTime = Z + Y.' while(Z <= StopTime){//作業を行います。スリープ(X); Z = GetCurrentTimeInSeconds(); } ' – sameerkn

+1

[x分ごとにメソッドを呼び出す]の可能な複製(http://stackoverflow.com/questions/13019433/calling-method-on-every-x-minutes) – Prabu

答えて

1

は、新しいスレッドを作成して、開始時刻に渡します。 X分間スリープした後、ループコードを使用します。開始時間を加えたY分が

を渡された場合、各ループについて、
while (DateTime.Now < startTime.AddMinutes(Y)) { 
    //your codes... 
} 
+0

睡眠を使用することは非常に悪いです。そのようなタスクを実行するためのいくつかの事前定義されたタイマーがあります。 – Prabu

+0

@Prabu私は参照してください..アドバイスありがとう –

0

別の方法が効果的ThreadPoolに戻って、現在のスレッドを解放し、持っている時間を与えた後、次の行を実行し続けますasync-await

public async Task RunAndListen() 
{ 
    DV.runprocess(); 

    string checkOutputFrequency = 
     System.Configuration.ConfigurationManager.AppSettings["CheckOutputFrequency"].ToString(); 

    decimal outfrequencyVal; 
    If (Decimal.TryParse(checkOutputFrequency, out outfrequencyVal) == false) 
    { 
     outfrequencyVal = 1; 
    } 

    var delayInMilliseconds = outfrequencyVal * 60 * 1000; 

    bool FileFound = DV.checkOutputFile(); 
    while (FileFound == false) 
    { 
     await Task.Delay(delayInMilliseconds); 
     FileFound = DV.checkOutputFile(); 
    }  
} 

ラインawait Task.Delay(delayInMilliseconds);でチェック経過。

関連する問題