0

以下のxmlを使用して、スケジュールされた日時を読み取り、スケジュールされた時間にアプリケーションを実行します。

<AvSchedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Days>
    <Day Name="Monday">true</Day>
    <Day Name="Tuesday">false</Day>
    <Day Name="Wednesday">false</Day>
    <Day Name="Thursday">false</Day>
    <Day Name="Friday">false</Day>
    <Day Name="Saturday">false</Day>
    <Day Name="Sunday">false</Day>
  </Days>
  <Time Hour="12" Minutes="15" />
</AvSchedule>

以下は、xmlを逆シリアル化するために私が書いたコードです。

AvSchedule avSchedule = null;


private void Deserialize()
{            
    FileStream fs = File.OpenRead(@"C:\Scheduler.xml");
    XmlSerializer serializer = new XmlSerializer(typeof(AvSchedule));
    Object obj = serializer.Deserialize(fs);
    if((obj != null) && (obj is AvSchedule))
    {
        avSchedule = obj as AvSchedule;
    }        
}

以下は、サービス開始時にアプリケーションを実行するための私の実装です。

protected override void OnStart(string[] args)
{
    //System.Diagnostics.Debugger.Launch();
    base.OnStart(args);
    Deserialize();
    Thread thr = new Thread( new ThreadStart(ScheduleThread));
    thr.Start();     
}



 public void  ScheduleThread()
 {                
       //Process logic should go here
        try
        {
            System.Diagnostics.ProcessStartInfo processStartInfo = new System.Diagnostics.ProcessStartInfo();
            processStartInfo.Arguments = "/Task {21211-A06D-4558-B833-98E8C7F62}";
            processStartInfo.FileName = "C:\\Program Files (x86)\\Logic\application.exe";
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo = processStartInfo;
            process.Start();
        }
        catch (Exception e)
        {
            Console.WriteLine("Unable to run", e.Message);
        } 

    }
}

///Sleep for 1 minute
Thread.Sleep(TimeSpan.FromMinutes(1));
}

}

予定時刻になったら、上記のアプリケーションを実行したいと思います。現在の日時をxmlでスケジュールされた日時と比較し、スケジュールされた日時に従ってアプリケーションを実行する必要があります。このための実装ヘルプを提供してください。

また、スケジュールされた日時に達したときにのみサービスが実行されるようにする必要があります(スケジュールされた時間に達するまでサービスはアイドル状態である必要があります)

4

1 に答える 1

1

私はあなたの質問に直接答えていないことを知っていますが...車輪の再発明をしないでください!

Quartz.netを使用する

Quartz.NETは、フル機能のオープンソースジョブスケジューリングシステムであり、最小のアプリから大規模なエンタープライズシステムまで使用できます。

非常に堅牢で信頼性が高く、あらゆるタイプのスケジューリングを実行できます。

あなたがしているようにプロセスを実行する代わりに、それは非常によく異なるスレッドを処理します。

xml構成であり、完全な機能です

私は多くのプロジェクトでそれを使用しました、そしてそれは非常にうまくいきます。

---コメント後の更新---------

タイマーを使う

以下のコードは、ニーズに適応できる単なる例です

public class ScheduleThread 
{
    private readonly TimeSpan _timeSpan;
    private readonly Timer _timer;
    public bool IsRunning { get; protected set; }   
    public ScheduleThread()
    {
        IsRunning = false;
                    //set the timespan according your config            
        _timeSpan = new TimeSpan();
    }
    public void Start()
    {
        if (IsRunning == false)
        {
            IsRunning = true;
            StartTimer();
        }
    }
    private void StartTimer()
    {
                    _timer = new Timer(CallBack);
        _timer.Change(_timeSpan, TimeSpan.Zero);
    }
    public void Stop()
    {
        if (IsRunning)
        {
            _timer.Dispose();
            IsRunning = false;
        }
    }
    private void CallBack(object obj)
    {
        //if process is not running
        //start process
    }       
}
于 2013-03-05T10:32:44.493 に答える