Найти косяки в службе - C#

Узнай цену своей работы

Формулировка задачи:

Написал свою первую службу. По задумке она через определенное время очищает некоторые папки. Интервал очистки и папки считываются из файла. Вот код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
 
namespace TempCleaner
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer Timer;
        private StreamWriter FileLog;
        private StreamReader FileOptions;
        private string PathLog;
        private string PathOptions;
        private int interval;
        List<string> DirectoryForClean;
        Thread BeginSettings;
 
        public Service1()
        {
            InitializeComponent();
        }
 
        protected override void OnStart(string[] args)
        {
            BeginSettings = new Thread(StartService);
            BeginSettings.IsBackground = true;
            BeginSettings.Start();
        }
 
        protected void StartService()
        {
            PathLog = "C:\\TempCleanerLog.txt";
            PathOptions = "C:\\TempCleanerOptions.opt";
            DirectoryForClean = new List<string>();
            FileLog = new StreamWriter(PathLog);
            FileLog.WriteLine("Запуск службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
            FileLog.Flush();
            FileLog.Close();
            FileOptions = new StreamReader(PathOptions);
            Int32.TryParse(FileOptions.ReadLine(),out interval);
            FileOptions.Close();
            Timer = new System.Timers.Timer(interval);
            Timer.AutoReset = true;
            Timer.Enabled = true;
            Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_elapsed);
            Timer.Start();
        }
 
        protected override void OnStop()
        {
            FileLog = new StreamWriter(PathLog);
            FileLog.WriteLine("Остановка службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
            FileLog.Flush();
            FileLog.Close();
            FileOptions.Close();
            Timer.Stop();
        }
 
        protected void Timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            FileLog = new StreamWriter(PathLog);
            FileOptions = new StreamReader(PathOptions);
            FileOptions.ReadLine();
            while (FileOptions.EndOfStream != true)
                DirectoryForClean.Add(FileOptions.ReadLine());
            for (int i = 0; i < DirectoryForClean.Count; ++i)
                try
                {
                    Directory.Delete(DirectoryForClean[i]);
                    Directory.CreateDirectory(DirectoryForClean[i]);
                    FileLog.WriteLine("Очистка папки " + DirectoryForClean[i]);
                    FileLog.Flush();
                }
                catch (Exception except)
                {
                    FileLog.WriteLine(except.Message);
                    FileLog.Flush();
                }
            DirectoryForClean.Clear();
            FileOptions.Close();
            FileLog.Close();
        }
    }
}
Скажите какие косяки я допустил при написании, чем это грозит и что здесь желательно исправить. И еще вопрос, нужно ли переопределять метод OnShutdown ? или onStop автоматически запускается при завершении системы?

Решение задачи: «Найти косяки в службе»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Threading;
 
namespace TempCleaner
{
    public partial class Service1 : ServiceBase
    {
        private System.Timers.Timer Timer;
        private StreamWriter FileLog;
        private StreamReader FileOptions;
        private string PathLog;
        private string PathOptions;
        private int interval;
        List<string> DirectoryForClean;
        Thread BeginSettings;
 
        public Service1()
        {
            InitializeComponent();
        }
 
        public override void OnStart(string[] args)
        {
            BeginSettings = new Thread(StartService);
            BeginSettings.IsBackground = true;
            BeginSettings.Start();
        }
 
        public void StartService()
        {
            PathLog = "C:\\TempCleanerLog.txt";
            PathOptions = "C:\\TempCleanerOptions.opt";
            DirectoryForClean = new List<string>();
            using (FileLog = new StreamWriter(PathLog))
            {
                FileLog.WriteLine("Запуск службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
                FileLog.Flush();
                FileLog.Close();
            }
            using (FileOptions = new StreamReader(PathOptions))
            {
                Int32.TryParse(FileOptions.ReadLine(), out interval);
                FileOptions.Close();
            }
            Timer = new System.Timers.Timer(interval);
            Timer.AutoReset = true;
            Timer.Enabled = true;
            Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_elapsed);
            Timer.Start();
        }
 
        public override void OnStop()
        {
            using (FileLog = new StreamWriter(PathLog))
            {
                FileLog.WriteLine("Остановка службы" + DateTime.Now.ToString("dd:mm:yy hh:mm:ss"));
                FileLog.Flush();
                FileLog.Close();
            }
            Timer.Stop();
        }
 
        public void Timer_elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            
            using(FileOptions = new StreamReader(PathOptions))
            {
                FileOptions.ReadLine();
                while (FileOptions.EndOfStream != true)
                    DirectoryForClean.Add(FileOptions.ReadLine());
            }
            using (FileLog = new StreamWriter(PathLog))
            {
                for (int i = 0; i < DirectoryForClean.Count; ++i)
                    try
                    {
                        Directory.Delete(DirectoryForClean[i]);
                        Directory.CreateDirectory(DirectoryForClean[i]);
                        FileLog.WriteLine("Очистка папки " + DirectoryForClean[i]);
                        FileLog.Flush();
                    }
                    catch (Exception except)
                    {
                        FileLog.WriteLine(except.Message);
                        FileLog.Flush();
                    }
                DirectoryForClean.Clear();
                FileOptions.Close();
                FileLog.Close();
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.636 из 5
Похожие ответы