-2

Windows サービスにタイマーがありますが、Windows サービスは本来すべきことを行いません。

私のコードの一部(更新):

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.Elapsed += new ElapsedEventHandler(getFileList);
    timer.Interval = 10000;
    timer.Enabled = true;
    timer.AutoReset = false;
}

private void getFileList(object sender, EventArgs e)
{
    //Work with xml...                
    DeleteOldBackupFiles();
}

private void DeleteOldBackupFiles()
{
    string[] Oldfiles = Directory.GetFiles(backup);
    foreach (string Ofile in Oldfiles)
    {
        FileInfo fi = new FileInfo(Ofile);
        if (fi.LastWriteTime < DateTime.Now.AddMonths(-2))
        {
            fi.Delete();
        }
    }
}

あなたのアイデアの後、コードを編集しましたが、結果は同じです..

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.Elapsed += new ElapsedEventHandler(getFileList);
    timer.Interval = 10000;
    timer.Enabled = true;
    timer.AutoReset = true;
}
4

3 に答える 3

1

これを次のように変更します。

protected override void OnStart(string[] args)
        {
            timer = new System.Timers.Timer();
            timer.Elapsed += new ElapsedEventHandler(getFileList);
            timer.Interval = 10000;
            timer.AutoReset = false;
            timer.Enabled = true;
        }
 private void getFileList(object sender, EventArgs e)
        {
            List<string> files = new List<string>();
            try
            {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(****);

AutoResetを false に設定すると、Timer が 1 回だけ起動します。つまり、タイマーの最初の発火後の自動停止のようなものです。つまり、getFileList メソッドで Timer を Stop() する必要はありません。これは、Timer 間隔が小さい場合の重要な違いです。AutoReset を true に設定し、ハンドラの先頭で Stop() を呼び出すと、メソッドが複数回呼び出される可能性がわずかにあります。AutoReset を false に設定することは、希望する動作を実現するためのより確実な方法です。

Start() を呼び出して Enabled を true に設定するのは冗長なので、Start() を削除しました。

間隔はミリ秒なので、10000 に変更しました。

于 2013-09-12T18:27:10.090 に答える