Найти косяки в службе - C#
Формулировка задачи:
Написал свою первую службу. По задумке она через определенное время очищает некоторые папки. Интервал очистки и папки считываются из файла. Вот код:
Скажите какие косяки я допустил при написании, чем это грозит и что здесь желательно исправить. И еще вопрос, нужно ли переопределять метод OnShutdown ? или onStop автоматически запускается при завершении системы?
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(); } } }
Решение задачи: «Найти косяки в службе»
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(); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д