問題 : 長時間実行中のプロセス中に 3 つの状態を追跡します。1) 特定の日に受信した電子メール レポートを送信するための EOD (End of day) シグナル 2) 同じ日に受信した新しいシグナル 改訂されたレポートを送信する (リビジョン番号を増やす) 3) 送信中に受信したシグナルその場合、EOD 信号が処理されていることをユーザーに警告するだけです。
End of day 信号を受信した後、実際の 1 日の終わりに... 真夜中に、すべての変数がリセットされます。
現在、3 つの個別のブール値で処理されています。問題は、ブール変数をそれほど多く使用せずに、この無限ループでこれら 3 つの条件を追跡するより効率的な方法があるかどうかです。
すべてを投稿するには多すぎるため、一部のコードですが、ここに要点があります。
public class job
{
private bool receivedEndOfDaySignal = false;
private bool receivedEodOfDaySignalSend = false;
private bool receivedEodOfDaySignalDuringSend = false;
public void RunThisJob(IJobData JobData, IJobStatus Status)
{
// job setup code.
// listener for incoming signals
Helper.OnSignalReceived += Helper_OnSignalReceived;
// loop for constant run
for (; ; )
{
//We're still cooking
Helper.StillGoing();
//wait till the email send is supposed to execute
Helper.WaitUntilTime(RunTime);
//Send the mail
SendMail();
// reset signal booleans
receivedEodOfDaySignalSend = receivedEodOfDaySignalDuringSend = false;
}
bool Helper_OnSignalReceived(IJobSignal signal, BatchWaitType waitType)
{
//Which?
switch (signal.Code.ToUpper())
{
case "ENDOFDAY":
// Acknowledge the end of day signal
// if end of day received more than once before being reset.
if (receivedEodOfDaySignalDuringSend)
{
Helper.Logger.Log(LogStatus.Info, "Batch", "An END OF DAY signal was already received. ");
Helper.Status.AcknowledgeSignal(signal);
return true;
}
// when an eod signal is received and revision count has been initialized increase the count.
// only initialized after first eod signal received and not when another receiving during a send
if (revisionCount != null) revisionCount++;
// set all the flags when EOD comes through even though some will still be set
receivedEndOfDaySignal = receivedEodOfDaySignalSend = receivedEodOfDaySignalDuringSend = true;
Helper.Status.AcknowledgeSignal(signal);
return true;
}
//Still here?
return false;
}
}
リスナーは、実行中のプロセスに適切な変数を設定します...私が持っているものは実際に機能します。これを行うためのより良い方法があるかどうか疑問に思っています。